Heim >Datenbank >MySQL-Tutorial >Beeinflusst die Reihenfolge der Bedingungen in einer MySQL-WHERE-Klausel die Abfrageleistung?
Beeinflusst die Reihenfolge der Bedingungen in einer MySQL-WHERE-Klausel die Leistung?
Bei MySQL-Abfragen mit umfangreichen WHERE-Klauseln und zahlreichen Bedingungen ist sie von entscheidender Bedeutung um die Leistung zu optimieren. Angenommen, eine bestimmte Bedingung, beispielsweise eine Firmenkennung, reduziert den Suchraum erheblich von Hunderttausenden auf Dutzende. Sollte diese Bedingung an erster Stelle in der Klausel stehen?
Betrachten Sie zwei Versionen einer Abfrage, die nach Clients sucht, die bestimmte Parameter erfüllen:
SELECT * FROM clients WHERE (firstname LIKE :foo OR lastname LIKE :foo OR phone LIKE :foo) AND (firstname LIKE :bar OR lastname LIKE :bar OR phone LIKE :bar) AND company = :ugh
SELECT * FROM clients WHERE company = :ugh AND (firstname LIKE :foo OR lastname LIKE :foo OR phone LIKE :foo) AND (firstname LIKE :bar OR lastname LIKE :bar OR phone LIKE :bar)
Auswirkungen auf die Leistung
Traditionell wurde angenommen, dass die Reihenfolge der Bedingungen minimale bis gar keine Auswirkungen auf die MySQL-Leistung hatte. Jüngste Tests und Erkenntnisse haben jedoch gezeigt, dass es in bestimmten Szenarien tatsächlich einen Unterschied machen kann.
Kurzschluss und Reihenfolge der Bedingungen
Der Schlüsselfaktor ist Kurzschluss -Schaltung. Wenn in MySQL zusammengesetzte Bedingungen ausgewertet werden, die durch AND oder OR verbunden sind, kann die Datenbank-Engine den ersten Operanden nur dann auswerten, wenn die Bedingung relevant ist. Diese Optimierung kann erheblich Zeit sparen, wenn die erste Bedingung den Suchraum erheblich einschränkt.
Demonstration
Um diesen Effekt zu veranschaulichen, betrachten Sie die folgenden Abfragen:
-- query #1 SELECT myint FROM mytable WHERE myint >= 3 OR myslowfunction('query #1', myint) = 1; -- query #2 SELECT myint FROM mytable WHERE myslowfunction('query #2', myint) = 1 OR myint >= 3;
Der einzige Unterschied besteht in der Reihenfolge der Operanden in der ODER-Bedingung. myslowfunction ist eine absichtlich teure Funktion, die den Nebeneffekt hat, dass jeder Aufruf protokolliert wird.
Wenn diese Abfragen ausgeführt werden:
myslowfunction called for query #1 with value 1 myslowfunction called for query #1 with value 2 myslowfunction called for query #2 with value 1 myslowfunction called for query #2 with value 2 myslowfunction called for query #2 with value 3 myslowfunction called for query #2 with value 4
Wie in der Ablaufverfolgung zu sehen ist, wird myslowfunction für Abfragen seltener aufgerufen #1, weil die erste Bedingung (myint >= 3) viele Zeilen eliminiert, die sie nicht erfüllen. Die Platzierung dieser Bedingung an erster Stelle ermöglicht eine vorzeitige Beendigung und verhindert eine unnötige Bewertung der langsamen Funktion.
Schlussfolgerung
Daher lautet die Antwort auf die Frage: Ja, Die Reihenfolge der Bedingungen in einer WHERE-Klausel kann aufgrund von Kurzschlüssen manchmal die MySQL-Leistung beeinträchtigen. Indem sie restriktive Bedingungen an die erste Stelle setzen, können Datenbank-Engines die Abfrageausführung optimieren, indem sie unnötige Verarbeitung vermeiden und die Effizienz maximieren.
Das obige ist der detaillierte Inhalt vonBeeinflusst die Reihenfolge der Bedingungen in einer MySQL-WHERE-Klausel die Abfrageleistung?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!