簡體   English   中英

WHERE 子句中的條件順序是否會影響 MySQL 性能?

[英]Does the order of conditions in a WHERE clause affect MySQL performance?

假設我有一個長而昂貴的查詢,包含條件,搜索大量行。 我還有一個特定條件,例如公司 ID,它將限制需要大量搜索的行數,將搜索范圍從數十萬縮小到數十個。

我是否這樣做對 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) 

這是一個演示,顯示 WHERE 子句條件的順序因短路而產生影響。 它運行以下查詢:

-- 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

上面顯示,當另一個操作數不總是為真時,當慢函數出現在OR條件的左側時,它會執行更多次。

所以 IMO 這個問題的答案是:

WHERE 子句中的條件順序是否會影響 MySQL 性能?

是“有時它可以做到”。

不,順序不應該有很大的不同。 在查找與條件匹配的行時,會檢查每一行的整個條件(通過布爾邏輯組合的所有子條件)。

一些智能數據庫引擎會嘗試猜測條件的哪些部分可以更快地評估(例如,不使用內置函數的東西)並首先評估那些,然后評估更復雜(估計)的元素。 這是由數據庫引擎決定的,而不是由 SQL 決定的。

where 子句中的列順序並不重要,因為 MySQL 會在執行之前優化查詢。 但我建議你閱讀 MySQL 參考手冊中關於優化的章節,以獲得關於如何分析查詢和表的基本概念,並在必要時優化它們。 不過就我個人而言,我總是嘗試將索引字段放在非索引字段之前,並根據它們應該返回的行數對它們進行排序(首先是最嚴格的條件,最后是最不嚴格的條件)。

數學上是的它有效果。 不僅在 SQL 查詢中。 而是在所有編程語言中,只要有and / or的表達式。 有一種完全評價或部分評價的理論。 如果它的一個與查詢的第一表達and計算結果為假時,將不會進一步檢查。 as anding false 任何東西都會產生 false 。 同樣,在 or 表達式中,如果第一個為真,則不會進一步檢查。

一個復雜的 DBMS 應該能夠自行決定首先評估哪個條件。 一些數據庫提供工具來顯示如何執行查詢的“策略”。 在 MySQL 中,例如,您可以在查詢前輸入EXPLAIN 然后 DBMS 打印它為執行查詢而執行的操作,例如索引或全表掃描。 因此,您可以一目了然地看到它是否在這兩種情況下都使用了“公司”的索引。

這不應該有任何影響,但是如果您不確定,為什么不簡單地嘗試一下呢? 從單個表中選擇的 where 子句的順序沒有區別,但是如果您連接多個表,連接的順序可能會影響性能(有時)。

我認為 where 子句的順序沒有任何影響。 我認為 MySQL 查詢優化器會按照它認為合適的方式重新組織 where 子句,因此它首先過濾掉最大的子集。

在談論連接時,這是另一回事。 優化器也嘗試在此處重新排序,但並不總能找到最佳方式,有時也不使用索引。 SELECT STRAIGHT JOIN 和 FORCE INDEX 讓您負責查詢。

不,不是,需要的表被選中,然后逐行評估。 順序可以任意。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM