我一直在分析我正在處理的應用程序中的一些查詢,並且遇到了一個查詢,該查詢檢索的行數多於必要的數量,結果集在應用程序代碼中被裁減。左連接優於內連接?
將LEFT JOIN更改爲INNER JOIN將結果集修剪爲所需內容,並且可能還會更高效(因爲選擇的行數更少)。事實上,LEFT JOINED的查詢表現超過INNER JOIN'ED,花了一半時間完成。
LEFT JOIN:(127點總的行,查詢花費0.0011秒)
INNER JOIN:(10點總的行,查詢花費0.0024秒)
(我跑的查詢多次,並且這些是平均數) 。
運行EXPLAIN上都顯示沒有任何解釋的性能差異:
對於INNER JOIN:
id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE contacts index NULL name 302 NULL 235 Using where
1 SIMPLE lists eq_ref PRIMARY PRIMARY 4 contacts.list_id 1
1 SIMPLE lists_to_users eq_ref PRIMARY PRIMARY 8 lists.id,const 1
1 SIMPLE tags eq_ref PRIMARY PRIMARY 4 lists_to_users.tag_id 1
1 SIMPLE users eq_ref email_2 email_2 302 contacts.email 1 Using where
對於LEFT JOIN:
id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE contacts index NULL name 302 NULL 235 Using where
1 SIMPLE lists eq_ref PRIMARY PRIMARY 4 contacts.list_id 1
1 SIMPLE lists_to_users eq_ref PRIMARY PRIMARY 8 lists.id,const 1
1 SIMPLE tags eq_ref PRIMARY PRIMARY 4 lists_to_users.tag_id 1
1 SIMPLE users eq_ref email_2 email_2 302 contacts.email 1
和查詢本身:
SELECT `contacts`.*, `lists`.`name` AS `group`, `lists`.`id` AS `group_id`, `lists`.`shared_yn`, `tags`.`name` AS `context`, `tags`.`id` AS `context_id`, `tags`.`color` AS `context_color`, `users`.`id` AS `user_id`, `users`.`avatar`
FROM `contacts`
LEFT JOIN `lists` ON lists.id=contacts.list_id
LEFT JOIN `lists_to_users` ON lists_to_users.list_id=lists.id AND lists_to_users.user_id='1' AND lists_to_users.creator='1'
LEFT JOIN `tags` ON tags.id=lists_to_users.tag_id
INNER JOIN `users` ON users.email=contacts.email
WHERE (contacts.user_id='1')
ORDER BY `contacts`.`name` ASC
(我所說的子句是「用戶」表上的最後一個INNER JOIN)
查詢在MySQL 5.1數據庫上運行,如果它有所不同。
有沒有人有一個線索,爲什麼在這種情況下,LEFT JOIN的查詢優於INNER JOIN?
更新:由於Tomalak的建議,我使用的小表使INNER JOIN更復雜,我創建了一個包含一些模擬數據的測試數據庫。 「用戶」表格爲5000行,聯繫人表格爲〜500,000行。結果是一樣的(時間也沒有改變,當你認爲表格現在更大時,這是令人驚訝的)。
我也在聯繫人表上運行ANALYZE和OPTIMIZE。沒有做出任何明顯的區別。
您是否嘗試先放置內連接? – 2008-10-09 06:10:02
我有,它確實加快了20%的查詢速度,但仍然比左加入速度更慢 – 2008-10-09 06:14:43
嘗試按順序構建每個查詢(加入一個表,測量,加入下一個等等)也許這可以幫助您確定慢速操作。 – Tomalak 2008-10-09 06:21:48