2013-12-17 81 views
0
Schema: 
CALL (ID,USER_ID(Foreign key),SP_USER_ID(Foreign key)) 
USER (ID,NAME) 

查詢1:從表1(外鍵)到表2(主鍵)加入2列 - 如何避免JOIN BUFFER?

SELECT u.name, 
     v.name 
FROM call c 
     INNER JOIN USER u 
       ON c.user_id = u.id 
     INNER JOIN USER v 
       ON c.sp_user_id = v.id 

查詢2:

SELECT u.name 
FROM call c 
     INNER JOIN USER u 
       ON c.user_id = u.id 

查詢2工作正常,結果快點過來了。

但是,查詢1需要大量的時間,有時MySQL客戶端崩潰(看到解釋計劃,它顯示了一個USER表中的「JOIN BUFFER」)。

「where」SP_USER_ID或USER_ID的條件有些快速給出結果,但它不在可接受的範圍內。「其中」其他列上的條件沒有任何影響。

如何避免JOIN BUFFER在這種情況下獲得更快的結果並通過連接或其他方式獲得期望的結果?

+0

你有三張桌子還是兩張桌子?你有另一張Super_User的桌子嗎? –

+0

。只有2個表 - CALL和USER.USER表具有所有用戶信息.CALL中的USER_ID與客戶ID相同,而CALL中的SP_USER_ID與正在服務/參與該客戶的個人ID相同。現在,我需要與USER表聯合以獲取USER_ID和SP_USER_ID的名稱。 – user104309

回答

1

希望有一個索引超過USER_ID列,並且不會超過SP_USER_ID列。因此它選擇JOIN BUFFER

根據文檔,A JOIN BUFFER僅用於連接類型爲ALLindex(換句話說,當沒有可能的鍵可以使用時)。

http://dev.mysql.com/doc/internals/en/join-buffer-size.html

+0

我在USER_ID和SP_USER_ID上都有索引。即使在這兩列上有索引似乎也沒有幫助我。 – user104309