我有以下查詢需要 3 秒
SELECT SQL_NO_CACHE e.Id
FROM `Email` e
LEFT JOIN basedb.emailconnections ec ON ec.id = e.EmailConnectionId
LEFT JOIN historydb.`event` ev ON ev.EmailId = e.Id
Where e.UserId = 228
OR ev.PartnerId = 150
AND ev.Private = 0;
問題來自(e.UserId = 228 OR ev.PartnerId = 150 AND ev.Private = 0)
如果我像這樣只從 WHERE 運行左側部分,則需要 0.04 秒
SELECT SQL_NO_CACHE e.Id
FROM `Email` e
LEFT JOIN basedb.emailconnections ec ON ec.id = e.EmailConnectionId
LEFT JOIN historydb.`event` ev ON ev.EmailId = e.Id
Where e.UserId = 228;
如果我像這樣運行正確的部分,則需要 0.03 秒
SELECT SQL_NO_CACHE e.Id
FROM `Email` e
LEFT JOIN basedb.emailconnections ec ON ec.id = e.EmailConnectionId
LEFT JOIN historydb.`event` ev ON ev.EmailId = e.Id
Where ev.PartnerId = 150
AND ev.Private = 0;
因此,如果我運行 2 個查詢而不是運行一個查詢,并且兩個更快的一次的結果計數與慢的一次匹配,它會更快
SQL_NO_CACHE僅用于除錯
uj5u.com熱心網友回復:
AND通常比 快OR。將首先使用一個表的測驗,然后它將“加入”到另一個表并按它過濾。這限制了 a
JOIN和的效率WHERE。檢查這個;
Where e.UserId = 228 OR ev.PartnerId = 150 AND ev.Private = 0;
是相同的
Where e.UserId = 228
OR ( ev.PartnerId = 150 AND ev.Private = 0 );
如果這不是您想要的,請更改括號。
這些索引可能對第一個查詢有所幫助(如前所述,用括號括起來):
e: INDEX(UserId, EmailConnectionId, Id) ev: INDEX(EmailId)正如評論中提到的,a
UNION通常是加速的方式OR。
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/474473.html
