gpt4 book ai didi

mysql - 如何优化或正确编写此 MYSQL 查询?

转载 作者:太空宇宙 更新时间:2023-11-03 10:25:26 25 4
gpt4 key购买 nike

今天在我的 mysql-slow.log 中注意到一个非常长的 SQL 查询

想请教一些SQL高手,如何正确格式化和执行这条SQL。

sql 背后的思想:从 2 个表返回所有不在 mailchimp 表中的电子邮件,并仅返回 DISTINCT 值(用户和订阅者电子邮件可能重复)。还包括结果中的城市和语言。

如您所见,query_time 非常长,检查的行只是 wtf 组合的 2 个表,应该只有大约 20k 行。

Query_time: 113.216544  Lock_time: 0.000180 Rows_sent: 43  Rows_examined: 208280841

SELECT * FROM
( SELECT u.email AS email, u.city, u.language FROM users AS u
LEFT JOIN mailchimp AS m ON u.email = m.email WHERE m.email IS NULL GROUP BY u.email
UNION SELECT s.email AS email, s.city, s.language FROM subscribers AS s
LEFT JOIN mailchimp AS m ON s.email = m.email WHERE m.email IS NULL GROUP BY s.email )
AS sync GROUP BY sync.email ORDER BY sync.email ASC;

解释查询

+----+--------------+------------+------+---------------+------+---------+------+-------+---------------------------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+--------------+------------+------+---------------+------+---------+------+-------+---------------------------------+
| 1 | PRIMARY | <derived2> | ALL | NULL | NULL | NULL | NULL | 23 | Using temporary; Using filesort |
| 2 | DERIVED | u | ALL | NULL | NULL | NULL | NULL | 10482 | Using temporary; Using filesort |
| 2 | DERIVED | m | ALL | NULL | NULL | NULL | NULL | 11411 | Using where; Not exists |
| 3 | UNION | s | ALL | NULL | NULL | NULL | NULL | 2709 | Using temporary; Using filesort |
| 3 | UNION | m | ALL | NULL | NULL | NULL | NULL | 11411 | Using where; Not exists |
| NULL | UNION RESULT | <union2,3> | ALL | NULL | NULL | NULL | NULL | NULL | |
+----+--------------+------------+------+---------------+------+---------+------+-------+---------------------------------+
6 rows in set (2 min 1.65 sec)

最佳答案

请注意解释计划中没有可用的 key 。这将使性能变得糟糕。对于每个用户记录,您必须扫描整个 mailchimp 表。然后对于每个订户记录,您扫描整个 mailchimp 表。您进行了大约 10482*11411 + 2709*11411 次读取。

也许 MySQL 专家可以在这里插话,但据我了解 MySQL 文档,它不像其他一些数据库引擎那样进行哈希匹配。一切都是循环和匹配。

您可以通过在 mailchimp.email 上创建索引来显着提高性能。

关于mysql - 如何优化或正确编写此 MYSQL 查询?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6280874/

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