gpt4 book ai didi

MySQL LEFT JOIN 优化

转载 作者:行者123 更新时间:2023-11-29 13:30:08 26 4
gpt4 key购买 nike

我有以下查询

  • 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 - NameDate 上的索引替换为双列索引,因为在最后一次连接中,您实际上是从 E 中进行选择,其中 namedate 与条件匹配。因为 name 是 eq,所以它应该位于索引的第一个位置。

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

这将使连接选择完全使用索引。

另外 - 我假设这是一个示例查询,但您似乎没有使用 BCD可能会减慢速度。

如果您提到的 WHERE 子句使用其他表中的值,我建议根据条件将它们更改为 INNER JOIN ..(它'如果您发布了一些您正在做的事情的示例,将会有所帮助)

关于MySQL LEFT JOIN 优化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19579185/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com