2013-03-15 1 views
80

Ich arbeite am Entwurf 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 datetime-Klausel, um Daten auszuwählen. Ist es eine gute Idee, Datetime-Felder in der MySQL-Datenbank zu indizieren?Ist es eine gute Idee, Datetime-Feld in MySQL zu indizieren?

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

Ich versuche, meine Datenbank arbeiten gut und Abfragen werden laufen zu halten reibungslos

Mehr, welche Idee denken Sie, ich sollte eine hohe Effizienz Datenbank erstellen müssen?

Antwort

102

MySQL empfiehlt Indizes für eine Vielzahl von Gründen, einschließlich der Beseitigung von Zeilen zwischen Bedingungen: http://dev.mysql.com/doc/refman/5.0/en/mysql-indexes.html

Das macht Ihre Datetime-Spalte ein ausgezeichneter Kandidat für einen Index, wenn Sie es in Bedingungen häufig in Abfragen gehen werden. Wenn Ihre einzige Bedingung BETWEEN NOW() AND DATE_ADD(NOW(), INTERVAL 30 DAY) ist und Sie keinen anderen Index in der Bedingung haben, muss MySQL einen vollständigen Tabellenscan auf jeder Abfrage tun. 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 zum Erstellen einer effizienten Datenbank ist sehr breit. Ich würde sagen, um sicherzustellen, dass es normalisiert ist und alle geeigneten Spalten indiziert sind (d. H. In Joins und Where-Klauseln verwendet).

+3

Vielen Dank für die Erklärung. Das hilft wirklich. Ich bin mir sicher, dass ich mehr Filter haben werde. Ich möchte nur sicherstellen, dass das Indexieren von Datum/Uhrzeit-Feld eine gute Idee ist oder nicht, da wir eine doppelte Datumszeit haben könnten. aber du antwortest es erklärt :) Danke – Jaylen

+3

+1 für 'in Joins und wo Klauseln verwendet'. Eine große Faustregel für eine Indexierungsstrategie. Offensichtlich denke ich jetzt darüber nach, aber mir ist –

7

Here Autor durchgeführte Tests zeigten, dass Ganzzahl-Unix-Timestamp ist besser als DateTime. Beachten Sie, dass er MySql verwendet hat. Aber ich fühle mich egal, welche DB-Engine Sie verwenden, wenn Sie Ganzzahlen vergleichen, sind etwas schneller als das Vergleichen von Daten, so dass der int-Index besser ist als der DateTime-Index. Take T1 - Zeit für den Vergleich von 2 Daten, T2 - Zeit für den Vergleich von 2 ganzen Zahlen. Die Suche in einem indizierten Feld dauert ungefähr 0 (log (Zeilen)), da der Index auf einem ausgeglichenen Baum basiert - er kann für verschiedene DB-Engines unterschiedlich sein, aber Log (Zeilen) ist eine allgemeine Schätzung. (Wenn Sie nicht den Bitmask- oder R-Tree-basierten Index verwenden). Also Unterschied ist (T2-T1) * Log (Zeilen) - kann Rolle spielen, wenn Sie Ihre Abfrage oft durchführen.

+0

noch nicht in den Sinn gekommen. Danke. Ich habe darüber als Option nachgedacht, wusste aber nicht, wie ich es angehen sollte. Ich glaube du bist absolut richtig Ganzzahlen sind immer schneller. – Jaylen

+26

Besser? Ich bezweifle, dass ein Unix-Timestamp für alle Fälle besser ist. Ja, das Speichern einer Ganzzahl ist im Allgemeinen schneller als das Speichern einer Zeichenfolge, aber was ist mit allen [DateTime-Funktionen] (http://dev.mysql.com/doc/refman/5.5/en/date-and-time-functions.html) MySQL macht aus? Sie selbst zu implementieren würde sich entweder negativ auf die Leistung oder Funktionalität auswirken. – Greg

Verwandte Themen