2010-07-29 7 views
6

Quando creo le tabelle manualmente in MySQL, aggiungo gli indici uno alla volta per ogni campo che penso utilizzerò per le query.Indici MySQL: avere più indici o avere una chiave multi-campo?

Quando uso phpMyAdmin per creare tabelle per me e seleziono i miei indici nel modulo create-table, vedo che phpMyAdmin combina i miei indici in 1 (più il mio primario).

Qual è la differenza? Uno è migliore dell'altro? In quale caso?

Grazie!

risposta

8

Questo in realtà dipende dalle vostre domande. Alcune query fanno un uso migliore degli indici a più colonne, altre no. EXPLAIN è tuo amico.

http://dev.mysql.com/doc/refman/5.6/en/explain.html

anche una buona risorsa è qui:

http://dev.mysql.com/doc/refman/5.6/en/optimization-indexes.html

+0

Non ho ancora scritto nessuna delle mie domande (solo in fase di progettazione). Quindi in pratica stai dicendo che non ho indici fino a quando avrò le mie domande pronte ... –

+1

Alcuni indici sono abbastanza facili da pensare in fase di progettazione, ma la maggior parte di essi verrà aggiunta quando crei le tue query. – Mchl

12

Né è particolarmente buona strategia, ma se dovessi scegliere mi piacerebbe raccogliere i più indici singoli.

Il motivo è che un indice può essere utilizzato solo se si utilizzano tutti i campi in qualsiasi prefisso completo dell'indice. Se hai un indice (a, b, c, d, e, f) allora funziona bene per una query che filtra su a o una query che filtra su entrambi a e b, ma sarà inutile per un filtro di query solo su c.

Non esiste una regola semplice che funzioni sempre per la scelta degli indici migliori. È necessario esaminare i tipi di query che si stanno facendo e scegliere gli indici che accelererebbero quelle particolari query. Se si pensa attentamente all'ordine delle colonne, è possibile trovare un piccolo numero di indici utili per più query diverse. Ad esempio se in una query si filtra su entrambi a e b e un'altra query si filtra solo su b quindi un indice su (b, a) sarà utilizzabile da entrambe le query ma un indice un (a, b) non lo farà.

Problemi correlati