【问题标题】:Is there a way to boost performance in this query有没有办法提高这个查询的性能
【发布时间】:2017-06-10 12:58:53
【问题描述】:

我正在尝试使用此查询在我的表中查找重复项:

SELECT  COUNT(*) as cnt, GROUP_CONCAT(id) AS ids
    FROM  `table`
    GROUP BY  col1, col2, col3, col4, col5, col6, col7, col8, col9, col10
    HAVING  cnt > 1';

它运行良好,但速度有点慢。你有什么想法可以加快速度吗?

【问题讨论】:

  • group by 可能是导致性能下降的原因,当你描述它DESCRIBE SELECT COUNT(*) as cnt, GROUP_CONCAT(id) AS ids FROM table GROUP BY col1, col2, col3, col4, col5, col6, col7, col8, col9, col10 HAVING cnt > 1'); 时将发生的事情转储出来,这样可以更好地了解查询发生了什么。
  • 这感觉很像“代码审查”类型的问题。
  • i.imgur.com/nxX9Veh.png 这是该描述的结果。表有大约 600k 行,更好的性能是当我通过一次循环取 50k 行来划分查询时。
  • 你给我们的信息很少。请阅读本文,尤其是关于查询性能的部分。 meta.stackoverflow.com/a/271056 那么请edit你的问题。
  • 您只想查找重复项吗?还是您想删除重复项?表中有多少百分比是重复的?对于一小部分人来说,一种技术比另一种更有效。

标签: php mysql performance


【解决方案1】:

您要求 MySQL 执行一项令人惊讶的复杂分组任务。

尝试创建一个覆盖索引,提及GROUP BY 子句中的所有列,然后是id 列。这可能有助于 MySQL 有效地执行您的查询。

但请注意:如果您通过省略一些 WHERE 子句来简化查询,则需要一个将它们考虑在内的索引。

http://use-the-index-luke.com/ 是一个很好的参考。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-11-01
    • 2021-08-02
    • 2020-12-01
    • 2021-09-06
    • 2022-11-07
    • 2021-12-06
    • 2012-09-19
    • 1970-01-01
    相关资源
    最近更新 更多