MySQL的左连接优化
问题描述:
我有以下查询其中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 | |
+----+-------------+-------+--------+---------------+----------+---------+-----------+--------+-------------+
答
我会建议更换,你有E
指标 - Name
和Date
用两个双列索引,因为,去年加入,你有效地从E
中选择其中name
和date
符合标准。因为name
是eq,所以应该在索引中首先。
ALTER TABLE `E` ADD INDEX idx_join_optimise (`name`,`date`)
这会让连接选择完全使用索引。
此外 - 我假设这是一个示例查询,但您似乎没有使用B
,C
或D
,这可能会减慢速度。
如果你提到的WHERE
条款从其他表使用值,我建议他们更改为基于标准的INNER JOIN
。(它会帮你贴的你在做什么的一些例子)
它通常包含哪些WHERE子句?而且 - 你预计B,C,D和E每个行有多少行,每行A *有*? – ruakh
你可以尝试只加入表A和E,看看需要多长时间?也许字符串匹配会让事情变得缓慢。 – Atle