Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Zusammengesetzte MySQL-Indizes und Operator BETWEEN

Dein Stil ist sehr ungewöhnlich.

Die meisten Leute würden wahrscheinlich WHERE began_at < NOW() AND finished_at > NOW() schreiben

Jedoch. Ich würde empfehlen, einen Index auf beide Felder zu setzen.

Ein kombinierter Schlüssel ist für Sie nicht von Nutzen, da er die Suche nur nach bestimmten Datumskombinationen beschleunigen würde.

Nun, das ist nicht ganz richtig, denn wenn Sie betree verwenden, hilft Ihnen ein kombinierter Schlüssel, aber nicht so gut, wie wenn Sie sie separat indizieren. Kombinierte Schlüssel sind sehr gut, wenn Sie nach Kombinationen von Feldern mit dem Gleichheitsoperator (=) suchen. Einzelfeld-Indizes funktionieren bei Ragen-Anfragen besser.

Sie können ein bisschen nach "multidimensional range search" googeln.

Der Grund dafür ist, dass alle übereinstimmenden Felder in einem Feld grundsätzlich in log(n)-Zeit in btrees gefunden werden können. Ihre Gesamtlaufzeit wird also O(k*log(n)) sein, was O(log(n)) ist.

Mehrdimensionale Bereichsabfragen haben eine Laufzeit von O(sqrt(n)), was höher ist. Allerdings gibt es auch bessere Implementierungen, die auch eine logarithmische Laufzeit erreichen. Allerdings sind sie nicht vollständig in MySQL implementiert, so dass es je nach Version schlechter oder schrecklich sein wird.

Lassen Sie mich also zusammenfassen:

  • Gleichheitsvergleiche auf Einzelfeldern:Hash-Index (Laufzeit O(1))

  • Bereichssuche für einzelne Felder:btree-Index für einzelne Felder ( O(log(n)) )

  • Gleichheitssuche in mehreren Feldern:Kombinierter Hash-Schlüssel (Laufzeit O(1))

diese Fälle sind eine klare Sache...

  • Bereichssuche in mehreren Feldern:separate Btree-Indizes ( O(log(n)) )

hier ist es nicht so klar. Bei aktuellen Versionen ist es aus den oben genannten Gründen eindeutig besser, separat zu indizieren. Mit einer perfekten Implementierung für diesen Anwendungsfall könnten Sie mit kombinierten Schlüsseln eine bessere Leistung erzielen, aber es ist kein System bekannt, das dies unterstützt. mysql unterstützt lose Indizes (die braucht man dafür) seit Version 5.0, aber nur sehr eingeschränkt und der Abfrageoptimierer nutzt sie afaik nur in seltenen Fällen. weiß nichts über neuere Versionen wie 5.3 oder so.

mit mysql, das lose Indizes implementiert, werden jedoch kombinierte Schlüssel für Felder, in denen Sie Bereichsanfragen oder Sortierungen in verschiedene Richtungen durchführen, immer relevanter.