2017-10-09 45 views
0

我有以下查詢:MySQL的多個或在WHERE

SELECT 
    b.business_name, 
    b.address, 
    b.city, 
    b.state, 
    b.phone_number, 
    i.date 
FROM business_table b 
LEFT JOIN inspection_table i ON b.id = i.business_id 
WHERE i.date = (
    SELECT MAX(i.date) 
    FROM inspection_table i 
    WHERE b.id = i.business_id 
) 
AND b.city LIKE '%Boston%' 
OR b.city LIKE '%Dallas%' 
OR b.city LIKE '%Seattle%' 
OR b.city LIKE '%New York%' 
OR b.city LIKE '%Portland%' 
OR b.city LIKE '%San Antonio%' 
OR b.city LIKE '%Los Angeles%' 
OR b.city LIKE '%Miami%' 
ORDER BY i.date DESC; 

我得到的結果我之後,但在查詢速度很慢(〜17S)。有沒有更好的方法來構造這個查詢?城市字段在business_table中編入索引。

+0

你** **可以使用'REGEXP'('b.city REGEXP「波士頓|達拉斯| Seattle''),但會實際上可能會稍微慢一些。它不應該花17秒,你的桌子有多少行? –

+0

〜我的表中有32,000行 – MoreScratch

+0

您是否嘗試過將括號放在您的OR列表中;還是你想要「最近來自波士頓...以及其他所有城市的一切」? – Uueerdo

回答

1

傳統的索引根本無助於LIKE '%pattern'查詢。該索引未被使用,並且您的查詢必須對錶進行完整的表掃描。

如果您希望使用MySQL進行高效搜索,則需要使用Full-Text Search Functions

您可能會喜歡我的演示文稿Full Text Search Throwdown,其中我比較了不同的MySQL文本搜索方法。

0

我有一種感覺,你或者是錯誤的,所以這是我認爲將是更好的查詢。

SELECT 
    b.business_name, 
    b.address, 
    b.city, 
    b.state, 
    b.phone_number, 
    li.lastInspection AS `date` 
FROM (SELECT business_id, MAX(i.date) as lastInspection 
     FROM inspection_table 
     GROUP BY business_id) AS li 
INNER JOIN business_table b 
ON li.business_id = b.business_id 
WHERE b.city LIKE '%Boston%' 
    OR b.city LIKE '%Dallas%' 
    OR b.city LIKE '%Seattle%' 
    OR b.city LIKE '%New York%' 
    OR b.city LIKE '%Portland%' 
    OR b.city LIKE '%San Antonio%' 
    OR b.city LIKE '%Los Angeles%' 
    OR b.city LIKE '%Miami%' 
ORDER BY li.lastInspection DESC 
; 

如果你有一個龐大的城市或企業,這可能是緩慢的;但我打賭inspection_table (business_id, date)上的索引會加快它的相當多。

理想情況下,這將得到您最後的檢查,找到他們的業務,然後過濾業務;如果不是這樣,你可以通過將除WHERE條件之外的所有條件都放在子查詢中來強制它,並讓外部查詢做最後的過濾。

0

在查詢的表述中似乎存在多個問題。其他答案帶出了一些修復。我會盡力解決所有問題。

括號是必須的 - x AND y OR z OR w被視爲(x AND y) OR z OR w。這可能會修復意圖和表現。

您是否在尋找South Boston以及Boston?另外Boston Heights?如果沒有,那麼擺脫通配符(%)。這將使索引city成爲可能。

如果你需要通配符,那麼使用FULLTEXT索引和MATCH...AGAINST...將會運行得更快。

在領先的%中,我認爲REGEXP建議的黑曜石時代會更快,因爲它只會執行一次city掃描。

如果business_id不是PRIMARY KEY,添加這些:

INDEX(business_id, date) 
INDEX(business_id, city)