2016-05-12 9 views
3

führte ich eine Suche auf MySQL auf der folgenden Tabelle, die Spalten und Indizes hat folgende:Wie kann die Suchzeit in MySQL DB verringert werden, wenn nach einem Datumsbereich gesucht wird?

columns

indexes

Die Anfrage war die folgende, bitte die Anzahl der Tage als 6 bemerken:

SELECT * FROM data WHERE TEMP<"3000" AND TEMP>"2600" AND Date_Time >"2016-05-05 %" and Date_Time <"2016-05-11 %"; 

Diese Abfrage liefert die Ergebnisse in 0.59s

Wenn ich die Anzahl der Tage, um mehr als das, wie in dieser Abfrage dann werde ich in viel mehr Zeit 2.15s

SELECT * FROM data WHERE TEMP<"3000" AND TEMP>"2600" AND Date_Time >"2016-05-04 %" and Date_Time <"2016-05-11 %"; 

Wie behebe ich dieses Problem bekommt das Ergebnis ändern? Ich finde es absurd, dass nur ein weiterer Tag die Geschwindigkeit so stark beeinflusst! Ich bin bestrebt, in einem größeren Zeitraum zu suchen, also muss ich den Grund dafür etwas wissen.

explain statements

+1

Interessante Frage. Versuchen Sie einen zusammengesetzten Index (TEMP, Date_Time) hinzuzufügen. Irgendwelche Geschwindigkeitsänderungen? – arhey

+1

Verwenden Sie die Klausel zwischen. Hier können Sie sehen, dass es tatsächlich die Leistung verbessert: http://stackoverflow.com/questions/15425230/is-it-a-good-idea-to-index-datetime-field-in-mysql –

+1

Können Sie erklären Ergebnisse für hinzufügen beide Abfragen? – arhey

Antwort

1

Fakt 1: MySQL kann nicht mehr als 1 Index in Ihrem Fall
Wie verwenden erklärt in diesem Blog-Eintrag https://www.percona.com/blog/2009/09/12/3-ways-mysql-uses-indexes/

wenn Sie Index (A, B) Diese Index kann verwendet werden, um Zeilen nach WHERE-Klauseln wie A = 5 zu suchen; A zwischen 5 und 10; A = 5 UND B ZWISCHEN 5 UND 10 es wird jedoch nicht in der Lage sein, Nachschlagezeilen für B BETWEEN 5 UND 10 Prädikat zu helfen, da es kein Indexpräfix ist.

in Ihrem Fall also, dass Sie die Spalten TEMP und Date_Time haben und Sie von Bereich suchen, wird der Bereich Index für entweder TEMP oder Date_Time und den zweiten Teil der Abfrage verwendet wird, verwendet wird ausgeführt, wo. Dies ist eine strukturelle Einschränkung der BTREE-Indizes.

Fakt 2: Der Index wird Ihre Abfrage nicht abdeckt, die Abfrage bedeutet, können nur Daten aus dem Index nicht ausgeführt werden, indem ohne die Zeile selbst Lesen

Ein vollständiger Tabellenscan durchgeführt wird von der liest Index zum Suchen von Datenzeilen> in Indexreihenfolge. Verwendet den Index nicht in der Spalte Extra. http://dev.mysql.com/doc/refman/5.7/en/explain-output.html#jointype_range

So was passiert in Ihrem ersten Abfrage:
1. MySQL wird für Date_Time Nachschlag in DATE_TIME Index und die index_rows wählen, die 'Date_Time> "2016.05.05%" und Date_Time < "fit 2016-05-11% " '
2. Im Index ist die TEMP-Information nicht verfügbar, daher muss MySQL alle index_rows aus der Datentabelle sammeln.
3. MySQL wird die Bedingung 'TEMP < "3000" UND TEMP> "2600"' auf jeder dieser Zeilen auswerten.

Was passiert in der zweiten Abfrage?
MySQL entscheidet sich, keine der verfügbaren Indizes (possible_keys) zu verwenden und führt einen vollständigen Tabellenscan durch, um die Werte zurückzugeben. Dies bedeutet, dass jede Zeile der Tabelle gescannt wird, um zu prüfen, ob die Bedingungen TEMP < "3000" UND TEMP> "2600" UND Date_Time> "2016-05-04%" und Date_Time < "2016-05-11% ". Dies passiert wahrscheinlich, weil es keinen Wert mit Präfix "2016-05-11" oder "2016-05-04" gibt.

+0

Danke @fathineos. Welchen Teil meinen Sie mit meinem zweiten Teil der Abfrage? Weil ich gerade diese Anweisung 'SELECT * FROM Daten WHERE Date_Time>" 2016-05-10% "und Date_Time <" 2016-05-16% ";' ausprobiert habe und das Ergebnis in ungefähr '0,79 Sek.' Gebracht habe. Als ich das Datum um einen Tag auf '" Date_Time <"2016-05-17%" 'erhöhte, wurde die Latenz dann zu '2.43 sec'. In diesem Fall wurde also nur die Date_Time Spalte benutzt, ist sie immer noch die selbe Situation ?! –

+1

Ihre Abfrage führt eine Suche 1) auf 'Date_Time' und 2) auf 'TEMP'. Ich sehe, dass Sie einen Index für jede dieser Spalten erstellt haben. Das Problem ist, dass MySQL nur einen verwenden kann diese Indizes in Ihrem Fall. Dies gilt sowohl auf Ihre Fragen. warum also die zweite langsamer ist? das Problem ist, dass die zweite Abfrage keinen Index überhaupt nicht verwenden (Key in erklären Ausgang NULL ist). Wie Sie das überwinden können? Sie müssen MySQL wahrscheinlich zwingen, den Date_Time-Index als @arhey zu verwenden. – fathineos

Verwandte Themen