WHERE 子句條件順序對MySQL 效能的影響
當使用多個條件建構複雜查詢時,指定這些條件的順序可以影響MySQL 效能。雖然順序對於簡單條件通常影響不大,但當一個條件顯著縮小結果集範圍時,順序就變得更加重要。
考慮以下兩個查詢:
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)
在這兩個查詢中,我們使用 OR 條件在多個欄位中搜尋符合特定條件的行。雖然第一個條件通常會產生較大的結果集,但「公司」條件將結果限制在較窄的範圍內。
根據 MySQL 的執行計劃,它遵循 WHERE 條件從左到右的評估順序。這意味著在第一個查詢中,MySQL 將在應用 OR 條件之前執行「company」條件。如果「company」條件傳回少量行,MySQL 將為它們建立索引以提高效率,減少處理後續 OR 條件的開銷。
相較之下,第二個查詢將「company」條件列在後面或條件。因此,MySQL 將首先執行 OR 條件,可能會處理大量行,並在需要時建立臨時索引。這個額外的索引步驟會增加查詢開銷。
短路和性能影響
需要注意的是,WHERE 子句條件的順序在某些情況下也會影響性能發生短路的地方。當一個條件被評估為真時,MySQL 立即返回整個條件為真,繞過後續條件的評估。
例如,考慮以下查詢:
SELECT myint FROM mytable WHERE myint >= 3 OR myslowfunction('query #1', myint) = 1;
If " myint >= 3」對於給定行計算為true,MySQL 將不會執行「myslowfunction」調用,這是一個耗時的操作。但是,如果「myslowfunction」出現在 OR 條件的左側,則會對所有行執行它,即使是那些不符合「myint >= 3」條件的行。
結論
雖然WHERE 子句條件的順序通常對性能影響很小,但在一個條件顯著縮小結果集的情況下,它可能成為一個因素或涉及短路的地方。將限制性較強的條件放在 WHERE 子句的開頭,您可以潛在地提高查詢效能和效率。
以上是WHERE子句條件的順序如何影響MySQL查詢效能?的詳細內容。更多資訊請關注PHP中文網其他相關文章!