私は、次の2つなインデックスインデックスが作成される順序は、クエリオプティマイザが選択するインデックスに影響しますか?
ALTER TABLE requests ADD INDEX daily_ips(exec_date, ip_address);
ALTER TABLE requests ADD INDEX is_cached(exec_date, cached);
を作成する場合show index from requests
の出力は、私は、クエリを強制したいと思いますしかし、私は次のクエリ
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 index NULL daily_ips 263 NULL 436695
を持って、次の
Table Non_unique Key_name Seq_in_index Column_name Collation Cardinality Sub_part Packed Null Index_type Comment Index_comment
requests 1 daily_ips 1 exec_date A 413 NULL NULL YES BTREE
requests 1 daily_ips 2 ip_address A 218334 NULL NULL YES BTREE
requests 1 is_cached 1 exec_date A 165 NULL NULL YES BTREE
requests 1 is_cached 2 cached A 165 NULL NULL YES BTREE
ですオプティマイザはdaily_ips
インデックスの代わりにis_cached
インデックスを使用します。
私はdaily_ips
インデックスを削除し、同じEXPLAIN
ステートメントを実行後、再び
ALTER TABLE requests DROP INDEX daily_ips;
ALTER TABLE requests ADD INDEX daily_ips(exec_date, ip_address);
それを追加した場合、クエリオプティマイザはis_cached
インデックスを選択します。
id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE requests index NULL is_cached 6 NULL 440493 Using index
クエリオプティマイザは、追加された順序に基づいてインデックスを選択することが予想されますか?
クエリオプティマイザにどのインデックスを使用するかを教えてください。
私は、インデックスがテーブルスキャンを行うためにのみ使用されていると信じています。実際にインデックスを使用する場合は、キャッシュ上のwhere条件でカウントする2つのクエリにクエリを再構成する必要があります。 (ただし、キャッシュはインデックスの最初のキーでなければなりません)。基本的に、CASEによってテーブルスキャンが実行されています。 – Corbin
私は自分の答えを更新しました –
@Corbinあなたが推薦するクエリをどうやって作成するのか分かりません。どのようにして正確に2つのクエリにクエリを再構成できますか(サンプルコードはどれくらい高く評価されますか) – user784637