Ich habe zwei Abfragen erstellt, die ich verwenden kann und die dieselbe Funktion haben. Beide enthalten Eigenschaften, die ich zu einer einzigen Abfrage zusammenführen möchte, die ich jedoch nicht ausführen konnte.
ABFRAGE 1 - Gibt mir genau die Ergebnisse, die ich will. Langsam (~ 0,700 Sek.)
ABFRAGE 2 - Gibt mir viele Zeilen, die ich ignoriere und überspringe. Schnell (~ 0,005 Sek.)
Mein Ziel ist es, QUERY 2 so zu modifizieren, dass alle Nullpreiszeilen mit Ausnahme von 1 für jeden Artikel fallen gelassen werden. Ich kann das scheinbar nicht ohne Leistungsverlust machen. Dies liegt an meinem Mangel an Erfahrung und Verständnis für die Indexnutzung in MySQL.
QUERY 1
Verwendet eine schlecht entworfene Unterabfrage, die keine Indizierung über tbl_sale (e) erlaubt, die 10k Zeilen enthält.
%Vor%Hier ist das EXPLAIN für QUERY 1
%Vor%ABFRAGE 2
Verwendet alle linken Joins, was sehr effizient ist (mit Ausnahme von ORDER BY). Indizes werden für jeden Join verwendet. Diese Abfrage gibt alle möglichen Übereinstimmungen für jedes Element in tbl_watch zurück. Hier ist die Abfrage:
%Vor%Hier ist das EXPLAIN für die Abfrage:
%Vor%Wie kann ich QUERY 2 (effizienter) ändern, um mir genau die Zeilen zu geben, die ich in QUERY 1 brauche, um damit zu arbeiten?
Danke Mike
Ich denke, diese Abfrage wird Ihnen geben, was Sie wollen:
%Vor%mit NULL beteiligt, werden Sie wahrscheinlich einige Links Joins haben. Der alternative Weg besteht darin, eine Union zu verwenden, die mit MySQL schneller sein kann:
%Vor%Sie könnten mit der zweiten Hälfte der Union spielen, die ein linker äußerer Join statt einer "nicht in" Unterabfrage ist - abhängig davon, wie Ihre Version von MySQL optimiert wird.
Ihr Subselect in QUERY 1 verwendet implizite innere Joins, während Abfrage 2 alle expliziten Joins für linke Joins verwendet. Daher gibt es keine where-Klauseln, um Daten in Abfrage 2 auszuschließen. Ich würde die LINKEN in ein paar Zeilen (wie markiert) herausnehmen und sehen, wie dies Dinge verbessert:
%Vor%Sie könnten auch erwägen, die Klauseln und aus den Joins herauszunehmen und sie in die WHERE zu verschieben:
%Vor%und schließlich, Datum Mathe ist ziemlich intensiv. In Abfrage 2, die Outer-Joins verwendet, vermeiden Sie viel davon, aber Sie benötigen es möglicherweise. Ich würde versuchen, eine Unterabfrage zu verwenden, um IDs zu erhalten und dadurch zu beschränken:
%Vor%