Mysql 为什么GROUP_CONCAT让我的查询速度更快?

Mysql 为什么GROUP_CONCAT让我的查询速度更快?,mysql,sql,performance,Mysql,Sql,Performance,我有一个相当大的MySQL表,我正在上面搜索重复项。我通过执行以下操作来查找电子邮件地址的精确匹配: SELECT email FROM customers WHERE email != '' GROUP BY email HAVING COUNT(*) > 1 SELECT * FROM customers WHERE email IN ([above query]); 此查询运行大约需要1.5秒 但是,如果我在select查询中添加一个GROUP_CONCAT,它只会将查询速度提高

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

SELECT email FROM customers WHERE email != '' GROUP BY email HAVING COUNT(*) > 1
SELECT * FROM customers WHERE email IN ([above query]);
此查询运行大约需要1.5秒

但是,如果我在select查询中添加一个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会使其返回更多数据,从而加快查询速度吗

当我对这两个查询进行解释时,没有组_CONCAT的版本说“使用where;使用temporary;使用filesort”,而有组_CONCAT的版本说“使用where;使用filesort”

所以我猜添加GROUP_CONCAT会使它不使用临时表,从而加快速度?这有什么办法吗?因为我真正想要的是一个电子邮件地址列表,所以我可以做如下事情:

SELECT email FROM customers WHERE email != '' GROUP BY email HAVING COUNT(*) > 1
SELECT * FROM customers WHERE email IN ([above query]);
我已经创建了一个模拟模式和数据,以便在

详情: 运行MySQL 5.6.36
我实际使用的Customers表有126633条记录和113053条不同的电子邮件记录。这些电子邮件中有4730封是空的。

请参阅并提供一个表结构,其中包含
显示创建表客户
、示例数据、预期结果以及帖子中
解释
的输出,以便我们进行验证。。同时发布MySQL版本可能很方便,因为MySQL版本之间的优化器发生了更改。
SELECT version()
还可以发布来自客户的
SELECT count(*)、来自客户的
SELECT count(*)和
SELECT count(*)的结果来自email=''
的客户。您在简单查询之后运行了
组\u CONCAT
查询,查询速度更快。您是否尝试过在
GROUP\u CONCAT
查询之后运行简单查询?这可能是因为数据被缓存,不必通过第二次查询从磁盘读取。(也就是说,无论哪个查询首先运行都很慢,下面的查询都很快。)我可以在MariaDB 10.0.19上验证执行时间的差异——尽管我也很好奇,但我只想将电子邮件数据类型更改为varchar(191),并在其上添加索引。那么所有查询的运行速度至少要快10倍。MySQL的优化器还远远不够完美。您似乎偶然发现了这样一种情况:它选择了一个次优的执行计划。这不应该导致您编写奇怪的查询(例如向每个
具有
子句的
添加
和GROUP_CONCAT(id)NOT NULL
)。在没有遇到性能问题时,不要“优化”查询。当修复优化器缺陷时,这种优化很容易在以后的MySQL版本中适得其反。现在,Paul Spiegel确认了这个问题(尽管是在MariaDB中),您可能想在MySQL中将其作为一个bug进行归档,这样他们就知道了这一点,并且可以处理它。