首页 > 解决方案 > 为什么 GROUP_CONCAT 让我的查询更快?

问题描述

我有一个相当大的 MySQL 表,我正在其上搜索重复项。我通过执行以下操作来查找电子邮件地址的完全匹配:

SELECT email FROM customers WHERE email != '' GROUP BY email HAVING COUNT(*) > 1

此查询大约需要 1.5 秒才能运行。

但是,如果我将 GROUP_CONCAT 添加到选择查询中,它会将其加速到大约半秒。例如,这两个都在大约半秒内运行:

SELECT GROUP_CONCAT(id), email FROM customers WHERE email != '' GROUP BY email HAVING COUNT(*) > 1;
SELECT GROUP_CONCAT(email) FROM customers WHERE email != '' GROUP BY email HAVING COUNT(*) > 1;

谁能解释为什么添加 GROUP_CONCAT 使其返回更多数据会加快查询速度?

当我对这两个查询进行 EXPLAIN 时,没有 GROUP_CONCAT 的版本说“使用 where;使用临时;使用文件排序”,而带有 GROUP_CONCAT 的版本说“使用 where;使用文件排序”

所以我想添加 GROUP_CONCAT 使它不使用临时表并加快它的速度?有没有办法解决?因为我真正想要的只是电子邮件地址列表,所以我可以执行以下操作:

SELECT * FROM customers WHERE email IN ([above query]);

我创建了一个模拟模式和数据以查看https://www.db-fiddle.com/f/aTPCPEjy5mp1EgLuvTjaUr/2上的差异

详细信息:我实际使用的运行 MySQL 5.6.36 客户表有 126,633 条记录和 113,053 条不同的电子邮件记录。这些电子邮件中有 4,730 封是空的。

标签: mysqlsqlperformance

解决方案


推荐阅读