Mysql
 sql >> Database >  >> RDS >> Mysql

Indici compositi MySQL e operatore BETWEEN

Il tuo stile è molto raro.

La maggior parte delle persone probabilmente scriverebbe WHERE began_at < NOW() AND finished_at > NOW()

Tuttavia. Consiglierei di inserire un indice su entrambi i campi.

Una chiave combinata non ti sarà utile perché accelererebbe solo la ricerca di combinazioni di date specifiche.

Bene, questo non è del tutto vero perché se usi betree una chiave combinata ti aiuterà ma non così bene come se le indicizzassi separatamente. Le chiavi combinate sono molto buone se cerchi combinazioni di campi con l'operatore di uguaglianza (=). Gli indici a campo singolo funzionano meglio nelle richieste di rabbia.

Puoi cercare un po' su Google per "ricerca multidimensionale".

Il motivo è che tutti i campi corrispondenti in un campo possono essere trovati fondamentalmente in log(n) time in btrees. Quindi il tuo runtime complessivo sarà O(k*log(n)) che è O(log(n)).

Le query Multidimensional Range hanno un runtime di O(sqrt(n)) che è maggiore. Tuttavia ci sono anche implementazioni migliori che garantiscono anche un runtime logaritmico. Tuttavia non sono completamente implementate in MySQL, quindi sarà peggio o terribile a seconda della versione.

Quindi permettetemi di riassumere:

  • Confronti di uguaglianza su singoli campi:indice hash (runtime O(1))

  • Ricerca per intervallo su singoli campi:indice btree su singoli campi ( O(log(n)) )

  • Ricerca di uguaglianza su più campi:chiave hash combinata (runtime O(1))

quei casi sono una cosa chiara...

  • Ricerca per intervallo su più campi:indici btree separati ( O(log(n)) )

qui è dove non è così chiaro. con le versioni attuali è chiaramente meglio indicizzare separatamente a causa dei motivi sopra indicati. Con un'implementazione perfetta per quel caso d'uso potresti ottenere prestazioni migliori con chiavi combinate ma non c'è nessun sistema a conoscenza di quale lo supporti. mysql supporta indici sciolti (che è necessario) dalla versione 5.0, ma solo molto limitato e Query Optimizer li utilizza solo in rari casi afaik. non conosco versioni più recenti come 5.3 o qualcosa del genere.

tuttavia, con l'implementazione di indici sciolti di mysql, le chiavi combinate sui campi in cui si effettuano intervalli di richieste o l'ordinamento in direzioni diverse diventano sempre più rilevanti.