2012-01-18 62 views
1

我有一個與from_uidto_uid(都索引)的鏈接表,我想過濾掉某些ID。所以,我做的:?MySQL緩慢雙加入

SELECT l.uid 
    FROM Link l 
    JOIN filter_ids t1 ON l.from_uid = t1.id 
    JOIN filter_ids t2 ON l.to_uid = t2.id 

現在,由於某種原因,這是出乎意料的慢:(而每個單獨的連接是非常快的,不能使用索引權

EXPLAIN告訴我:

id select table type possible_keys key  key_len ref rows Extra 
1 SIMPLE t1 index Null   PRIMARY 34  Null 12205 Using index 
1 SIMPLE l  ref from_uid,to_uid from_uid 96  func 6  Using where 
1 SIMPLE t2 index Null   PRIMARY 34  Null 12205 Using where; Using index; Using join buffer 

回答

0

不知道是否會幫助,但嘗試:

select l.uid 
from Link l 
where l.from_uid in (select id from filter_ids) 
and l.to_uid in (select id from filter_ids) 

也許它會做出更好的工作,不知疲倦XES。

0

EXPLAIN告訴你JOIN實際上是從t1表開始的。這就是你需要添加一個新的指數Link(或更好的擴展當前from_uid指數):

(from_uid, to_uid, uid) 

,或者如果uid是主鍵,只是:

(from_uid, to_uid) 

UPD 什麼你描述的很奇怪。你可以嘗試運行:

SELECT STRAIGHT_JOIN l.uid 
FROM Link l 
JOIN filter_ids t1 ON l.from_uid = t1.id 
JOIN filter_ids t2 ON l.to_uid = t2.id 
+0

我不是專家,但我可以告訴擁有該表的人。技術上是否有辦法強制mysql在不修改表的情況下正確/更快地執行該操作? – Gerenuk 2012-01-19 09:35:32

+0

@Gerenuk,實際上,你應該將數據庫調整到你的查詢而不是查詢數據庫。如果查詢不是那麼重要,那麼您應該接受它可能效率低下。 – newtover 2012-01-19 09:53:37

+0

那麼,正如我所說的,實際上我不能通過will修改鏈接表。問題是如果可以在一個查詢中執行,因爲分割查詢非常快。順便說一句,你的建議索引使查詢甚至更慢...... :( – Gerenuk 2012-01-19 10:30:19