mysql - 为什么 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 封是空的。
解决方案
推荐阅读
- node.js - Node JS Sequelize 模型中的继承
- ruby-on-rails - 我应该将 uuid 列类型用于 Rails 中的关联吗?
- mysql - 查询将每个主项目汇总到库存
- reactjs - onSubmit 在“react-material-ui-form-validator”中不起作用
- postgresql - 对 pg_stat_progress_vacuum 的查询不返回任何内容
- javascript - javascript 事件处理程序不工作(按钮点击 - 谷歌说空)
- mysql - MySQL - 使用 Group By 显示组合列
- outlook - Outlook 上下文加载项 - 下载链接不起作用
- keras-tuner - 用于 LSTM 的 Kerastuner
- css - 在 webview 中使用 javascriptexecutor 和 sendkeys 的文件附件