2013-10-25 190 views
0

我有以下查詢其中MySQL的左連接優化

  • A具有1個000 000行
  • B,C,d爲150 000行,每行
  • E具有50個000行

查詢本身似乎需要大約50秒才能完成。它通常會包含一個WHERE子句,因爲它正在搜索數據庫中的所有可能數據。有什麼辦法可以改進?

SELECT A.one, A.two, A.three 
FROM A 
LEFT JOIN B ON (A.id = B.id) 
LEFT JOIN C ON (A.id = C.d) 
LEFT JOIN D ON (A.id = D.id) 
LEFT JOIN E ON (A.name = E.name 
AND E.date <= A.date) 
ORDER BY A.id ASC 

解釋查詢:

+----+-------------+-------+--------+---------------+----------+---------+-----------+--------+-------------+ 
| id | select_type | table | type | possible_keys | key  | key_len | ref  | rows | Extra  | 
+----+-------------+-------+--------+---------------+----------+---------+-----------+--------+-------------+ 
| 1 | SIMPLE  | A  | index | NULL   | PRIMARY | 17  | NULL  | 357752 |    | 
| 1 | SIMPLE  | B  | eq_ref | PRIMARY  | PRIMARY | 17  | db.A.id |  1 | Using index | 
| 1 | SIMPLE  | C  | eq_ref | PRIMARY  | PRIMARY | 17  | db.A.id |  1 | Using index | 
| 1 | SIMPLE  | D  | eq_ref | PRIMARY  | PRIMARY | 17  | db.A.id |  1 | Using index | 
| 1 | SIMPLE  | E  | ref | Name,Date  | Name  | 62  | db.A.name |  1 |    | 
+----+-------------+-------+--------+---------------+----------+---------+-----------+--------+-------------+ 
+0

它通常包含哪些WHERE子句?而且 - 你預計B,C,D和E每個行有多少行,每行A *有*? – ruakh

+0

你可以嘗試只加入表A和E,看看需要多長時間?也許字符串匹配會讓事情變得緩慢。 – Atle

回答

1

我會建議更換,你有E指標 - NameDate用兩個雙列索引,因爲,去年加入,你有效地從E中選擇其中namedate符合標準。因爲name是eq,所以應該在索引中首先。

ALTER TABLE `E` ADD INDEX idx_join_optimise (`name`,`date`) 

這會讓連接選擇完全使用索引。

此外 - 我假設這是一個示例查詢,但您似乎沒有使用B,CD,這可能會減慢速度。

如果你提到的WHERE條款從其他表使用值,我建議他們更改爲基於標準的INNER JOIN。(它會幫你貼的你在做什麼的一些例子)