如果我創建以下兩個indicies創建索引的順序會影響查詢優化程序將選擇哪個索引?
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
是它預期的查詢優化器的行爲選擇基於其加入的順序上的索引?
如何告訴查詢優化器使用哪個索引?
我相信索引只是用來做表掃描。如果您想實際使用索引,則應將查詢重構爲兩個查詢,並在緩存中對where條件進行計數。 (雖然緩存必須是索引中的第一個鍵)。基本上,CASE會導致您執行表掃描。 – Corbin
我已經更新了我的答案檢查 –
@Corbin我不確定我瞭解如何執行查詢。我怎樣才能將查詢重組爲2個查詢(任何示例代碼將不勝感激)? – user784637