3

EXPLAINインデックスなしでこのクエリを実行する場合

EXPLAIN SELECT exec_date,
    100 * SUM(CASE WHEN cached = 'no' THEN 1 ELSE 0 END)  / SUM(1) cached_no,
    100 * SUM(CASE WHEN cached != 'no' THEN 1 ELSE 0 END)  / SUM(1) cached_yes
FROM requests
GROUP BY exec_date

これが出力です

id  select_type table       type    possible_keys   key     key_len ref     rows    Extra
1   SIMPLE      requests    ALL     NULL            NULL    NULL    NULL    478619  Using temporary; Using filesort

インデックスを作成すると

ALTER TABLE requests ADD INDEX exec_date(exec_date);

出力は

id  select_type table       type    possible_keys   key         key_len ref     rows    Extra
1   SIMPLE      requests    index   NULL            exec_date   4       NULL    497847  

の値Extraが空白なので、キーexec_dateが使用されていないということですか?

EXPLAINテストサーバーでは、インデックスがある場合とない場合の実際の(ステートメントではない)クエリの実行時間は同じです。

4

1 に答える 1

4

Using indexあなたがそれが何を意味すると思うかを意味するのではありません。列に存在する場合はExtra、オプティマイザが実際に行全体を読み取っていないことを示しています。インデックスを(排他的に)使用して列情報を検索しています。

キーはまだ他の目的で使用されている可能性があります。たとえば、WHERE句がある場合にルックアップを実行するためなどです。たとえば、特定のシナリオではUsing temporary;、MySQLが不要になったため、実際にインデックスが表示されなくなったということは、インデックスが使用されていることを意味します。テーブルの内容を新しい一時テーブルに再配置して、を実行しGROUP BYます。

于 2012-11-26T06:47:45.990 に答える