Ist es eine gute Idee, das Datum / Uhrzeit-Feld in MySQL zu indizieren?

137

Ich arbeite am Entwerfen einer großen Datenbank. In meiner Anwendung werde ich viele Zeilen haben, zum Beispiel habe ich derzeit eine Tabelle mit 4 Millionen Datensätzen. Die meisten meiner Abfragen verwenden die datetime-Klausel, um Daten auszuwählen. Ist es eine gute Idee, Datums- / Uhrzeitfelder in der MySQL-Datenbank zu indizieren?

Select field1, field2,.....,field15
from table where field 20 between now() and now + 30 days 

Ich versuche, meine Datenbank funktionsfähig zu halten und Abfragen reibungslos auszuführen

Welche Idee sollte ich Ihrer Meinung nach haben, um eine hocheffiziente Datenbank zu erstellen?

Jaylen
quelle
Was ist field 20?
AlikElzin-Kilaka

Antworten:

164

MySQL empfiehlt die Verwendung von Indizes aus verschiedenen Gründen, einschließlich der Beseitigung von Zeilen zwischen Bedingungen: http://dev.mysql.com/doc/refman/5.0/en/mysql-indexes.html

Dies macht Ihre datetime-Spalte zu einem hervorragenden Kandidaten für einen Index, wenn Sie sie unter Bedingungen verwenden, die häufig in Abfragen enthalten sind. Wenn Ihre einzige Bedingung ist BETWEEN NOW() AND DATE_ADD(NOW(), INTERVAL 30 DAY)und Sie keinen anderen Index in der Bedingung haben, muss MySQL bei jeder Abfrage einen vollständigen Tabellenscan durchführen . Ich bin nicht sicher, wie viele Zeilen in 30 Tagen generiert werden, aber solange es weniger als etwa 1/3 der gesamten Zeilen ist, ist es effizienter, einen Index für die Spalte zu verwenden.

Ihre Frage zur Erstellung einer effizienten Datenbank ist sehr weit gefasst. Ich würde sagen, nur um sicherzustellen, dass es normalisiert ist und alle entsprechenden Spalten indiziert sind (dh diejenigen, die in Joins und where-Klauseln verwendet werden).

Explosionspillen
quelle
3
Vielen Dank für die Erklärung. Das hilft wirklich. Ich bin sicher, ich werde mehr Filter dazu haben. Ich möchte nur sicherstellen, dass die Indizierung des Datums- / Uhrzeitfelds eine gute Idee ist oder nicht, da wir möglicherweise eine doppelte Datums- / Uhrzeit haben. aber du antwortest erklärt es :) Danke
Jaylen
4
+1 für 'in Joins und where-Klauseln verwendete'. Eine gute Faustregel für eine Indexierungsstrategie. Offensichtlich denke ich jetzt darüber nach, war mir aber noch nie in den
Sinn gekommen
1
Aber wenn Sie die Daten mit Datum abfragen Bereich , wie zum Beispiel Daten reichen von „2017.01.01 11.20“ bis „2018.01.03 00.12“, macht es nicht SELECTAbfrage schneller , obwohl ich indizierte date timeSpalte. .. Index Abfrage schnell machen, wenn ich equalOperation benutze .. Habe ich recht?
user3595632
1
Wie wäre es, wenn Sie Datenzeitfelder mit Zeitfunktionen wie DAY (Datum / Uhrzeit) oder HOUR (Datum / Uhrzeit) abfragen. Hilft oder behindert der Index in diesem Fall?
Cronoklee
hi @Explosion Pills, wenn ich die Tabellenbasis nur nach Jahr und Monat abfragen muss, erhalte ich eine bessere Leistung, wenn ich eine neue Spalte mit nur Jahr und Monat erstellt und dann indiziert habe, anstatt direkt einen Index der datetime-Spalte zu erstellen ? So erstelle ich eine Spalte, deren Wert wie 201801 ist.
Woods Chen
18

Hier haben vom Autor durchgeführte Tests gezeigt, dass der Ganzzahl-Unix-Zeitstempel besser ist als DateTime. Beachten Sie, dass er MySql verwendet hat. Ich bin jedoch der Meinung, dass unabhängig davon, welche DB-Engine Sie zum Vergleichen von Ganzzahlen verwenden, etwas schneller ist als das Vergleichen von Datumsangaben, sodass der int-Index besser ist als der DateTime-Index. Nehmen Sie T1 - Zeit zum Vergleichen von 2 Daten, T2 - Zeit zum Vergleichen von 2 ganzen Zahlen. Die Suche in einem indizierten Feld dauert ungefähr 0 (log (Zeilen)) Zeit, da der Index auf einem ausgeglichenen Baum basiert - er kann für verschiedene DB-Engines unterschiedlich sein, aber Log (Zeilen) ist trotzdem eine häufige Schätzung. (Wenn Sie keine Bitmaske oder keinen R-Tree-basierten Index verwenden). Der Unterschied ist also (T2-T1) * Protokoll (Zeilen) - kann eine Rolle spielen, wenn Sie Ihre Abfrage häufig ausführen.

Baurzhan
quelle
Danke dir. Ich dachte darüber nach, wusste aber nicht, wie ich es angehen sollte. Ich glaube, Sie haben absolut Recht, ganze Zahlen sind immer schneller.
Jaylen
62
Besser? Ich bezweifle, dass ein Unix-Zeitstempel in allen Fällen besser ist. Ja, das Speichern einer Ganzzahl ist im Allgemeinen schneller als das Speichern einer Zeichenfolge, aber was ist mit allen DateTime-Funktionen, die MySQL verfügbar macht? Die Implementierung selbst würde sich entweder negativ auf die Leistung oder die Funktionalität auswirken.
Greg