如何使我的MySQL SUM()查询更快

时间:2011-07-01 04:59:58

标签: mysql sql

我在users表上有大约100万行,并且通过示例列A AA B BB C CC D DD E EE F FF来计算int0& 1

SELECT 
CityCode,SUM(A),SUM(B),SUM(C),SUM(D),SUM(E),SUM(F),SUM(AA),SUM(BB),SUM(CC),SUM(DD),SUM(EE),SUM(FF)
FROM users 
GROUP BY CityCode

结果8 rows in set (24.49 sec)

如何让我的陈述更快?

5 个答案:

答案 0 :(得分:2)

CityCode列上创建索引。

答案 1 :(得分:2)

我相信这不是因为SUM(),试着说select CityCode from users group by CityCode;它应该同时采取neary ...

答案 2 :(得分:2)

使用explain来了解查询的执行计划。

创建至少一个或多个索引。如果可能,请使用CityCode主键。

试试这个

SELECT CityCode,SUM(A),SUM(B),SUM(C),SUM(D), SUM(E),SUM(F),SUM(AA),SUM(BB),SUM(CC),SUM(DD),SUM(EE),SUM(FF)
FROM users 
GROUP BY CityCode,A,B,C,D,E,F,AA,BB,CC,DD,EE,FF

答案 3 :(得分:1)

  • 使用更好的硬件
  • 增加缓存大小 - 如果使用InnoDB引擎,则增加innodb_buffer_pool_size
  • 重构您的查询以限制用户数量(当然,如果业务逻辑允许)

答案 4 :(得分:0)

您没有WHERE子句,这意味着查询必须扫描整个表。这会使它在大桌子上变慢。

你应该考虑你需要多久做一次以及它的影响是什么。一些建议是:

  • 不要改变任何东西 - 如果它不重要
  • 有一个表包含与“users”相同的数据,但没有任何其他您不想查询的列。它仍然会很慢,但 慢,特别是如果有更大的那些
  • (InnoDB)使用CityCode作为表“用户”主键的第一部分,这样就可以进行PK扫描并避免任何排序(可能仍然太慢)
  • 创建并维护某种摘要表,但每次用户更改(或容忍陈旧数据)时都需要更新它

但请确保这种优化是绝对必要的。