首先,我有以下表結構。爲什麼Mysql沒有在使用OR的WHERE子句上使用索引?
Table Document
## DocID ## ## DocName## ## DuplicateID ##
1 Doc1 null
2 Doc2 null
3 Doc3 null
4 Doc4 1
Table FolderTree
## FolderID ## ## MemberDocID ##
1 1
1 2
1 3
我有DocID, DuplicateID and MemberDocID and FolderID
我的查詢索引是這樣的:
SELECT d.*
from Document d, FolderTree f
WHERE (d.DocID = f.MemberDocID or d.DuplicateID = f.MemberDocID) and f.FolderID = 1
GROUP BY d.DocID ;
所以基本上我想要從文件夾ID爲1的所有文件及從表中的重複文件。 group by用於維護記錄的唯一性,即不會檢索兩次文檔。
該查詢工作正常,但在大量記錄中變得更慢。下面是解釋輸出。
| select type | table | type | possible_keys | key | rows | extra |
simple d range PRIMARY,... PRIMARY 83168 Using temporary..
simple f All DuplicateIDInx Null 108787 Using join buffer
我關心的是,表F不使用上DuplicateID索引。 我的問題是,爲什麼這樣?有人可以在這個問題上給我啓發。 林使用MySQL 5.x的 謝謝:)
重寫使用'UNION'查詢 - 這是一個共同的技巧,以避免ORs(這是不是很好優化) – zerkms
我已經讀過它,有沒有另一種選擇?在休眠不支持聯盟,我希望這些以後轉換成hql。 :) –
檢查發佈的查詢。你有'd.DuplicateID = f.MemberID',但你在表f中沒有提到'MemberID'。我想這是一個錯字。 –