是否可以在 MySQL 中加快 sum() 的速度?

Posted

技术标签:

【中文标题】是否可以在 MySQL 中加快 sum() 的速度?【英文标题】:Is it possible to speed up a sum() in MySQL? 【发布时间】:2010-02-01 16:55:06 【问题描述】:

我正在对 mysql 数据库执行“从 bar 中选择 sum(foo)”查询,该数据库汇总了 7.3 毫米的记录,每次运行大约需要 22 秒。有没有加快 MySQL 求和的技巧?

【问题讨论】:

虽然在其他数据库中是可能的;前任。 Oracle, MS SQL, 【参考方案1】:

不,你不能加速函数本身。这里的问题实际上是您选择了 730 万条记录。 MySQL 必须扫描整个表,而 730 万是一个相当大的数字。实际上,它完成得如此之快让我印象深刻。

您可以采用的策略是将数据分解为更小的子集(可能按日期?月份?),并为不会改变的旧数据保持一个总和。您可以定期更新总和,并且可以通过将总和以及此后添加的任何新数据相加来计算总体值,这将是更少的行数。

【讨论】:

【参考方案2】:

在mysql中开启QUERY CACHE。默认情况下缓存是关闭的。你需要设置mysql ini文件。

-- hint mysql server about caching
SELECT SQL_CACHE sum(foo) FROM bar;

如果未对表进行任何更改,MySQL 优化器可能能够返回缓存。

在这里阅读更多: http://www.mysqlperformanceblog.com/2006/07/27/mysql-query-cache/

【讨论】:

foo 的值更新时,缓存值会更新吗?或者 MySQL 是否会在下次运行此查询时再次重新汇总整个表? @BlueRaja-DannyPflughoeft 缓存将被清除,并将重新汇总整个表。 查询缓存自 MySQL 5.7.20 起已弃用,并在 MySQL 8.0 中删除。 dev.mysql.com/doc/refman/5.7/en/query-cache-configuration.html【参考方案3】:

这里有两件事:

1) 您不应该定期对 730 万条记录进行求和 - 引入满足业务需求(按日、月、年、部门等)的临时表并按计划填充它们,可能会重复使用这些表而不是原始的“原始”表(例如在需要几天间隔时为每天选择汇总值等)

2) 检查您的交易设置

http://dev.mysql.com/doc/refman/5.0/en/set-transaction.html#isolevel_repeatable-read

【讨论】:

【参考方案4】:

不,不是真的。它总是需要枚举表中的所有行。

您可以创建一个附加表并在每次插入、更新、删除时更新其中的总和?

【讨论】:

【参考方案5】:

您或许可以尝试在 bar.foo 字段上添加索引。该索引将包含 bar 列的所有值,但比原始 foo 表更小,因此扫描速度更快,尤其是当 foo 有很多其他列时。

【讨论】:

修复了引用该列的错误。应该是 bar.foo,而不是 foo.bar。感谢@harry-b【参考方案6】:

如果您的查询真的那么简单,不... 但是,如果您使用的是更复杂的查询(并在此处缩写),您可以(可能) - 喜欢使用更好的连接...

【讨论】:

也许这个答案与所问的确切问题无关,但实际上导致性能问题的罪魁祸首往往是 JOINS。您应该始终牢记,MySQL 没有任何神奇的机制来优化连接!

以上是关于是否可以在 MySQL 中加快 sum() 的速度?的主要内容,如果未能解决你的问题,请参考以下文章

带有索引的 MySQL 表:许多插入/更新会影响性能吗?如果是,如何再次加快速度?

MySQL 从属复制 - 从属在主控之后 - 如何加快速度?

使用 sum 和 group by 选项的 Mysql 查询运行速度非常慢

添加 Limit 可以加快 mysql 查询速度,为啥?

MySQL 服务器的加快运行速度有哪些方法?

假如mysql数据库单表有100W行记录,有哪些方式加快查询速度