Schnelle Seite Retrieval in MySQL, Indexnutzung?
-
03-07-2019 - |
Frage
Ich mag eine MySQL-Abfrage beschleunigen, die im Grunde eine Seite von Daten nach folgendem Muster
abrufenselect
my_field_A,
my_field_B
where
time_id >= UNIX_TIMESTAMP('1901-01-01 00:00:00') AND
time_id < UNIX_TIMESTAMP('2009-01-16 00:00:00')
Das Feld time_id
ist ein MySQL-Index, doch verhält sich die Abfrage, als ob die gesamte Datenbank bei jeder Abfrage gelesen wurde (ein paar Zeilen abzurufen sind schon recht langsam). Ich kein Experte in MySQL. Kann jemand raten, was ich falsch mache?
Lösung
Stellen Sie sicher, dass Sie einen Index (B-Baum) auf TIME_ID haben, sollte dies für Bereichsanfragen effizient sein. Achten Sie außerdem darauf, dass TIME_ID das jeweilige Zeitformat ist.
Wenn Sie wirklich wollen, zu verstehen, was mysql tut man das Schlüsselwort hinzufügen ‚erklären‘ infront der Abfrage und führen Sie es in Ihrem MySQL-Client. Dies wird einige Informationen zeigen, was mysql tut und welche Art von Scans durchgeführt werden.
Andere Tipps
Da es wahrscheinlich viele time_id
die unter diesen Kriterien fallen, MySQL
kann denken, dass die Full Table Scan besser ist.
Versuchen Sie, den Index zu zwingen:
SELECT
my_field_A,
my_field_B
FROM mytable FORCE INDEX (index_name_on_time_id)
WHERE
time_id >= UNIX_TIMESTAMP('1901-01-01 00:00:00') AND
time_id < UNIX_TIMESTAMP('2009-01-16 00:00:00')
Sie benötigen den unteren Bereich? Gibt es irgendwelche Einträge früher als 1901? Wie wird die TIME_ID Spalte erzeugt? Wenn die TIME_ID immer größer mit jedem neuen Eintrag wird in DB hinzugefügt, können Sie mit am nächsten Eintrag zu 2009-01-16 Suche nach ID zu prüfen, und wählen Sie dann mit ID
select my_field_A, my_field_B
FROM
mytable
WHERE
id <= ?
Wenn das nicht der Fall ist, versucht Partitionierung zur Verfügung Check-out von MySQL 5.1 und bricht die Tabelle nach Jahren auf, dass die Geschwindigkeit drastisch erhöhen sollte.