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?
field 20
?Antworten:
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).
quelle
SELECT
Abfrage schneller , obwohl ich indiziertedate time
Spalte. .. Index Abfrage schnell machen, wenn ichequal
Operation benutze .. Habe ich recht?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.
quelle