是否有可能加速MySQL中的sum()?

时间:2010-02-01 16:55:06

标签: mysql performance optimization sum

我正在对MySQL数据库执行“从条形图中选择总和(foo)”查询,该数据库总计7.3毫米记录并且每次运行大约需要22秒。加速MySQL的总和是否有诀窍?

6 个答案:

答案 0 :(得分:35)

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

您可以采用的策略是将数据分成较小的子集(可能按日期?月?)并保留不会改变的旧数据的总和。您可以定期更新总和,并且可以通过添加总和以及从那时起添加的任何新数据来计算总体值,这将是更少的行数。

答案 1 :(得分:11)

在mysql中打开QUERY CACHE。默认情况下,缓存为OFF。你需要设置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/

答案 2 :(得分:8)

这里有两件事:

1)您不应该定期为7.3m记录做总计 - 引入服务于业务需求的登台表(按天,月,年,部门等)并按计划填写,可能会重复使用这些表而不是原始的'原始'表(如需要几天间隔时选择每天的汇总值等)

2)检查您的交易设置

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

答案 3 :(得分:3)

不,不是真的。它总是必须枚举表中的所有行。

你可以创建一个额外的表并在每次插入,更新,删除时更新总和吗?

答案 4 :(得分:1)

您可以尝试在bar.foo字段上添加索引。索引将包含bar列的所有值,但是更小,因此扫描比原始foo表更快,特别是如果foo有很多其他列。

答案 5 :(得分:0)

如果你的查询真的那么简单,没有...... 但如果你使用更复杂的查询(并在此缩写)你可以(可能) - 比如使用更好的连接...