2013-10-10 61 views
2

想我這樣做:MySQL的後備WHERE語句

SELECT * FROM table WHERE field2 = '[email protected]' OR field2 LIKE '%%[email protected]%%'; 

在這種情況下,它會嘗試執行兩個field2 = '[email protected]'field2 LIKE '%%[email protected]%%'條件(即,它會搜索匹配,因此這些條件需要行匹配一些更多的計算能力,試圖找到行匹配兩個條件,即使它已經發現了一排匹配field2 = '[email protected]'

有沒有辦法通過改革查詢才指示MySQL的嘗試執行field2 LIKE '%%[email protected]%%'如果條件field2 = '[email protected]'不匹配任何事都可以查詢變得更高效

IE。我基本上希望mysql只嘗試找到匹配field2 LIKE '%%[email protected]%%'的行,只有當沒有行匹配field2 = '[email protected]'。如果找到完全匹配的行field2 = '[email protected]',不要試圖去匹配field2 LIKE '%%[email protected]%%'

此外,沒有子查詢

+0

這是否工作:'SELECT * FROM table WHERE field2 ='2019 @ 162440'OR(field2!='2019 @ 162440'AND field2 LIKE'%% 2019 @ %%');' –

+0

它會返回相同的 – AdrianBR

+0

@AdrianBR是的,但會保持mysql做這兩個檢查?我在這裏問,我不知道。 –

回答

1

讓我首先說我不是MySQL的專家。它不像其他一些DBMS那樣優化,所以下面的查詢可能不會真正減少執行時間。但它是值得一試...

如果field2被索引,這可能是一個非常快速的解決方案:

-- Get results where field2 = '[email protected]' 
SELECT * 
FROM table 
WHERE field2 = '[email protected]' 
-- Append... 
UNION 
-- Get results where field2 LIKE '%%[email protected]%%' but only 
-- if there are no rows where field2 = '[email protected]' 
SELECT * 
FROM table 
WHERE NOT EXISTS(
      SELECT * 
      FROM table 
      WHERE field2 = '[email protected]' 
     ) 
    AND field2 LIKE '%%[email protected]%%' 

你要運行最快的查詢和選擇所有結果。然後,追加包含EXISTS的第二個較慢的查詢。如果子查詢包含任何行,則EXISTS子句將返回true,這些行應將整個第二個查詢短路並防止其運行(因此附加0行)。但是,如果第一個查詢返回0行,則第二個查詢將啓動並運行較慢的LIKE比較。