【问题标题】:How to improve a simple MySQL-Query如何改进一个简单的 MySQL-Query
【发布时间】:2017-10-30 15:47:08
【问题描述】:

为了获得计数,我必须在实时系统上运行这个相当简单的查询。问题是表和数据库的设计效率很低,而且由于它是一个实时系统,因此在这一点上它不是一个选项。
所以我必须找出一个运行速度很快并且不会让系统太慢的查询,因为在查询执行期间系统基本上停止了,这并不是我真正想要的 livesystem 做的,所以我需要简化我的查询,以使其在可接受的时间内执行。

SELECT id1, count(id2) AS count FROM table GROUP BY id1 ORDER BY count 
DESC;

所以这里是查询,不幸的是它是如此简单以至于我对如何进一步改进它没有想法,也许其他人有一个想法......?

【问题讨论】:

  • 您可以为 id1 列添加索引。
  • > 因为它是一个实时系统,在这一点上改变它不是一个选项
  • 可能连一个索引(id1, id2)都有一个覆盖索引,那么MySQL就不用读取实际数据了。
  • 更改表(添加索引正在更改)不是一种选择
  • 看看 percona 工具,例如。 pt-online-schema-change 工具在更改时不会锁定表。或者 gh-ost...

标签: mysql database performance


【解决方案1】:

应用程序通过应用程序更改获得“足够好”的结果:

如果您可以访问应用程序,但不能访问数据库,那么有可能:

定期运行慢速查询并捕获结果。然后使用缓存的结果。

你都需要吗

目标是什么?找出几个最常见的 id1?给他们排名?

返回查询

COUNT(id2) 检查id2 是否不为空;这我们通常是不必要的,所以COUNT(*) 更好。然而,加速是微不足道的。

ORDER BY NULLCOUNT 最高的行无关——排序需要在某处进行。将其移至应用程序无济于事;至少不多。

添加LIMIT 10 只会有所帮助,因为它可以缩短将数据发送回客户端的时间。

INDEX(id1) 是查询的最佳索引(更改为COUNT(*) 后)。但是操作还是需要

  • 完整索引扫描以执行COUNTGROUP BY
  • 对分组结果进行排序——对于ORDER BY

零或接近零的停机时间

您是否已建立复制? Galera 聚类?

查看pt-online-schema-changegh-ost

真正的目标是什么?

我们无法修复所写的查询。我们可以改变什么?更好的是,最终目标是什么——也许有一种方法不涉及任何看起来最不像您要加速的查询。

【讨论】:

    【解决方案2】:

    现在我刚刚转储表并将其导入 MySQL-Docker,在那里运行查询,花了很长时间,实际上我不得不移动我的整个 Docker,因为转储太大了,但最后我得到了我的结果现在我知道有多少 id2 与特定的 id1 相关联(撇号形成复数?您可能需要仔细检查;))。
    正如已经指出的那样,查询已经没有太大的改进空间了。

    仅供参考,突然停止系统的关心消失了,现在我们正在索引表,到目前为止花了 6 个小时,看不到尽头 :D

    不管怎样,谢谢大家的帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-10-28
      • 2018-08-18
      • 2019-09-01
      • 1970-01-01
      • 2016-04-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多