MySQL WHERE 子句中的條件順序是否會影響效能?
在具有大量 WHERE 子句和眾多條件的 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)
對效能的影響
傳統上,人們認為條件的順序對MySQL 效能的影響很小甚至沒有影響。然而,最近的測試和見解表明,在某些情況下,它確實可以發揮作用。
短路和條件順序
關鍵因素是短-電路。在 MySQL 中,當評估由 AND 或 OR 連接的複合條件時,資料庫引擎僅當條件相關時才評估第一個操作數。如果第一個條件大大縮小了搜尋空間,則此最佳化可以節省大量時間。
示範
為了說明此效果,請考慮以下查詢:
-- 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;
唯一的差異是 OR 條件中操作數的順序。 myslowfunction 是一個刻意昂貴的函數,其中包括記錄每次呼叫的副作用。
執行這些查詢時:
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
如追蹤所示,myslowfunction 被呼叫的查詢次數較少#1 因為第一個條件(myint >= 3) 消除了許多不滿足它的行。首先放置此條件可以提前終止並防止對慢速函數進行不必要的評估。
結論
因此,問題的答案是:是的,由於短路,WHERE 子句中的條件順序有時會影響MySQL 效能。透過先放置限制性條件,資料庫引擎可以透過避免不必要的處理並最大限度地提高效率來優化查詢執行。
以上是MySQL WHERE 子句中條件的順序會影響查詢效能嗎?的詳細內容。更多資訊請關注PHP中文網其他相關文章!