次の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
は次のとおりです
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
私は次のクエリを持っています
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
is_cached
ただし、クエリオプティマイザにインデックスの代わりにインデックスを使用するように強制したいと思いdaily_ips
ます。
インデックスを削除しdaily_ips
て再度追加すると
ALTER TABLE requests DROP INDEX daily_ips;
ALTER TABLE requests ADD INDEX daily_ips(exec_date, ip_address);
次に、同じEXPLAIN
ステートメントを実行すると、クエリオプティマイザが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
クエリオプティマイザが追加された順序に基づいてインデックスを選択することは予想される動作ですか?
クエリオプティマイザに使用するインデックスを指示するにはどうすればよいですか?