2012-06-04 33 views
0

我想知道MySQL有什麼更好的。我有一個SELECT查詢,排除與禁用的用戶ID相關的每個條目。MySQL中更快的是什麼? WHERE子請求= 0或IN列表

目前我在那張像

AND (SELECT COUNT(*) 
    FROM TheBlackListTable 
    WHERE userID = userList.ID 
     AND blackListedID = :userID2) = 0 

的WHERE語句子查詢子句將接受每userIDTheBlackListTable

不存在難道是更快地檢索第一全部取締ID先前的請求,並用

AND creatorID NOT IN listOfBannedID 
+1

BENCHMARK或EXPLAIN EXTENDED怎麼樣? – rkosegi

回答

0

替換前面的子句使用EXISTS子句檢查使用r不在黑名單中。當存在固定值或值的低計數

示例查詢

Select * from userList 
where not exists(Select 1 from TheBlackListTable where userID = userList.ID) 

IN子句被使用。

+0

感謝您對我們的回答! –

2

LEFT JOIN/IS NULLNOT IN是最快的:

SELECT * 
FROM mytable 
WHERE id NOT IN 
     (
     SELECT userId 
     FROM blacklist 
     WHERE blackListedID = :userID2 
     ) 

SELECT m.* 
FROM mytable m 
LEFT JOIN 
     blacklist b 
ON  b.userId = m.id 
     AND b.blackListedID = :userID2 
WHERE b.userId IS NULL 

NOT EXISTS產生同樣的計劃,但由於實現缺陷是稍微低效率:

SELECT * 
FROM mytable 
WHERE NOT EXISTS 
     (
     SELECT NULL 
     FROM blacklist b 
     WHERE b.userId = m.id 
       AND b.blacklistedId = :userID2 
     ) 

所有這些查詢在第一場比賽中停止在blacklist(因此執行semi-join

COUNT(*)溶液是最有效的,因爲MySQL將計算的實際COUNT(*)而不是停止在第一個匹配。

但是,如果您在(userId, blacklistedId)上有UNIQUE索引,則這不是問題,因爲無論如何都不能有多個匹配。

+0

謝謝你的回答! –

相關問題