Ho una tabella di voci 200k con colonne di INT. Voglio creare un indice per rendere le query più veloci. Questa è la query che vorrei eseguire: SELECT A,B,C,D,E FROM table WHERE A=23 and (B=45 or C=43)
. Ho creato i seguenti indici: B
, ACD
, C
, ABC
.MySQL. Creazione di un indice per query "OR"
Con il comando EXPLAIN
ho trovato che MySQL sceglie l'indice ACD
. Così ho continuato a popolare la tabella con più valori e mi sono reso conto che MySQL stava passando dagli indici sopra (non sempre lo stesso).
Poiché ci sono molti inserti, avere vari indici causerà problemi di prestazioni e possiamo presumere che questa tabella sia accessibile da altre query che richiedono colonne diverse in cui ogni indice ha senso.
Sono a conoscenza dello USE INDEX()
, ma mi piacerebbe capire se dovremmo fidarci di MySQL per scegliere l'indice giusto.
Cosa intendi per "possiamo supporre che questa tabella sia accessibile da altre query che richiedono colonne diverse in cui ogni INDICE ha senso"? Potresti fornire alcuni esempi di tali domande? Puoi darci anche l'output di una query 'SHOW INDEXES FROM table'? Gli indici su A, AB e AC sono sicuramente ridondanti: questi sono già coperti dagli indici su ACD/ABC, ABC e ACD rispettivamente. Puoi leggere come MySQL gestisce gli indici multi-colonna su http://dev.mysql.com/doc/refman/5.0/en/mysql-indexes.html – Daan
Query di esempio: 'RICEVI B DA tabella WHERE B = 12'. Ok, posso eliminare A, AB, AC (grazie). Ma non spiega ancora il motivo dell'uso di "ACD". Quando 'D' non è nemmeno nell'istruzione' WHERE'. –
Sì, è un po 'misterioso: l'output di una query 'SHOW INDEXES FROM table' può aiutare a capire perché sta accadendo :) – Daan