2016-06-01 9 views
0

Ich habe einen „events“ TischMySQL Indizes nicht in einer SELECT-Klausel Unterabfrage

table events 
    id (pk, auto inc, unsigned int) 
    field1, 
    field2, 
    ... 
    date DATETIME (indexed) 

Ich versuche, Löcher in der trafic zu analysieren (die Momente, in denen es 0 Ereignis in einem Tag)

ich versuche, diese Art von Anfrage

SELECT 
    e1.date AS date1, 
    (
     SELECT date 
     FROM events AS e2 
     WHERE e2.date > e1.date 
     LIMIT 1 
    ) AS date2 
FROM events AS e1 
WHERE e1.date > NOW() -INTERVAL 10 DAY 

Es hat eine sehr große Menge an Zeit Hier wird die explai nimmt

n

+----+--------------------+-------+-------+---------------------+---------------------+---------+------+----------+-------------+ 
| id | select_type  | table | type | possible_keys  | key     | key_len | ref | rows  | Extra  | 
+----+--------------------+-------+-------+---------------------+---------------------+---------+------+----------+-------------+ 
| 1 | PRIMARY   | t1 | range | DATE    | DATE    | 6  | NULL |  1 | Using where | 
| 2 | DEPENDENT SUBQUERY | t2 | ALL | DATE    | NULL    | NULL | NULL | 58678524 | Using where | 
+----+--------------------+-------+-------+---------------------+---------------------+---------+------+----------+-------------+ 
2 rows in set (0.00 sec) 

Getestet auf MySQL 5.5

Warum kann mysql die DATE Indexe verwenden? ist es wegen einer Unterabfrage?

+0

Wie viele Zeilen gibt es in Ihrer 'events' Tabelle? – 1000111

+0

ca. 60 Millionen – nemenems

+0

kann ein Tippfehler sein ** WO e1> JETZT() -INTERVAL 10 TAG **. sollte das sein: 'WHERE e1.date> NOW() -INTERVAL 10 DAY' – 1000111

Antwort

1

Ihre Abfrage leidet unter dem Problem here, das auch eine schnelle Lösung mit temporären Tabellen darstellt. Das ist eine mysql forum-Seite, die ich durch Auffinden der this Stackoverflow-Frage ausgegraben habe.

Sie können feststellen, dass die Erstellung und das Auffüllen einer solchen neuen Tabelle im laufenden Betrieb zu einer erträglichen Leistung führt und mit dem Datumsbereich now() weniger als 10 Tage einfach zu implementieren ist.

Wenn Sie Hilfe bei der Herstellung brauchen, lassen Sie es mich wissen. Ich werde sehen, ob ich helfen kann.

+0

Thx, aber ich verstehe, dass MySQL ist immer noch nicht bereit für die Arbeit mit SUBQUERIES ... Ich muss eine alternative Möglichkeit finden, Löcher im Verkehr zu analysieren – nemenems

+0

Nun lassen Sie mich wissen, wenn ich helfen kann. Nicht sicher, welche Löcher im Verkehr bedeutet, es sei denn, Sie beziehen sich auf Ihre Veranstaltung und nächste Event-Problem (Lücken) – Drew

+0

Löcher sind Lücken.Ich möchte Perioden ohne Verkehr erkennen Die andere Möglichkeit, dies zu erreichen, ist GROUP BY SUBSTR (Datum, 1, 16). Ich werde alle Minuten mit dem Verkehr haben. Und ich werde mit dieser Abfrage die Lücken mit einem externen Skript finden. – nemenems

0

Sie suchen nach Daten ohne Ereignisse?

Zuerst erstellen Sie eine Tabelle Days mit allen möglichen Daten (dy). Dies gibt Ihnen die ereignislosen Tage:

SELECT dy 
    FROM Days 
    WHERE NOT EXISTS (SELECT * FROM events 
         WHERE date >= days.day 
          AND date < days.day + INTERVAL 1 DAY) 
     AND dy > NOW() -INTERVAL 10 DAY 

Bitte beachten Sie, dass 5.6 einige Optimierungen in diesem allgemeinen Bereich hat.

+0

Dies ist die Alternative, die ich anwenden werde ... Aber es ist enttäuschend, dass MySQL 5.5 diese Art von Unterabfragen nicht behandelt. Wenn ich mehr Zeit habe, werde ich versuchen, einen Test gegen 5.6 oder 5.7 Thx für die Hilfe zu tun – nemenems