2013-10-25 191 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。(它会帮你贴的你在做什么的一些例子)