Se creo le seguenti due indiciesL'ordine in cui vengono creati gli indici influisce su quale indice sceglierà Query Optimizer?
ALTER TABLE requests ADD INDEX daily_ips(exec_date, ip_address);
ALTER TABLE requests ADD INDEX is_cached(exec_date, cached);
L'uscita show index from requests
è la seguente
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
Ho la seguente domanda
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
Tuttavia desidero forzare la query ottimizzatore per utilizzare l'indice is_cached
anziché l'indice daily_ips
.
Se rimuovo l'indice daily_ips
e aggiungi di nuovo
ALTER TABLE requests DROP INDEX daily_ips;
ALTER TABLE requests ADD INDEX daily_ips(exec_date, ip_address);
quindi eseguire la stessa EXPLAIN
dichiarazione, query optimizer sceglie l'indice 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
E 'un comportamento previsto per l'ottimizzatore delle query di scegliere un indice in base all'ordine è stato aggiunto?
Come si comunica a Query Optimizer quale indice utilizzare?
Credo che l'indice venga utilizzato solo per eseguire una scansione della tabella. Se si desidera utilizzare effettivamente l'indice, è necessario ristrutturare la query in due query che eseguono un conteggio con una condizione where su cache. (Anche se la cache dovrebbe essere la prima chiave nell'indice, ovviamente.) Fondamentalmente, CASE sta causando una scansione della tabella. – Corbin
Avevo aggiornato la mia risposta per verificare che –
@Corbin non sono sicuro di aver capito come farei a fare la query che mi consiglia. In che modo posso ristrutturare esattamente la query in 2 query (qualsiasi codice di esempio sarebbe molto apprezzato)? – user784637