在mysql上执行SUM()并按数百万行分组

在mysql上执行SUM()并按数百万行分组,mysql,database,performance,Mysql,Database,Performance,我有一个查询,每个请求只运行一次 SELECT SUM(numberColumn) AS total, groupColumn FROM myTable WHERE dateColumn < ? AND categoryColumn = ? GROUP BY groupColumn HAVING total > 0 选择SUM(numberColumn)作为总计,groupColumn 从myTable 其中dateColumn

我有一个查询,每个请求只运行一次

SELECT SUM(numberColumn) AS total, groupColumn
FROM myTable
WHERE dateColumn < ? AND categoryColumn = ?
GROUP BY groupColumn
HAVING total > 0
选择SUM(numberColumn)作为总计,groupColumn
从myTable
其中dateColumn<?和categoryColumn=?
按组列分组
总数大于0的
myTable
的列数不到12列,最多可以增加500万行,但在生产中更可能增加约200万行。查询中使用的所有列都是数字,除了
dateColumn
,并且
dateColumn
categoryColumn
上都有索引

如果数据库得到了适当的优化,那么在大多数现代服务器上,这个查询在5秒钟内运行500万行是否合理

我问的原因是我们没有500万的数据,在未来几年内我们甚至不会达到200万,如果查询没有在5秒内运行,那么很难知道问题出在哪里。是因为查询不适合大型表,还是数据库没有优化,或者服务器功能不够强大?基本上,我想知道在一个大表上使用
SUM()
groupby
是否合理


谢谢。

一个重要的问题是dateColumn 按日期进行积极的筛选,并按日期对表进行分区,可以在大得离谱的表上提供惊人的性能


顺便说一句,如果你不希望在未来的很多年里得到这么多的数据,不要费心去解决它。到那时,您的业务需求以及体系结构、数据库布局、设计和实现细节可能会发生十几次变化。提前计划是很好的,但有时您希望尽快给出足够好的解决方案,并在下一版本中处理未来的棘手问题。

一个重要的问题是dateColumn 按日期进行积极的筛选,并按日期对表进行分区,可以在大得离谱的表上提供惊人的性能


顺便说一句,如果你不希望在未来的很多年里得到这么多的数据,不要费心去解决它。到那时,您的业务需求以及体系结构、数据库布局、设计和实现细节可能会发生十几次变化。提前计划很好,但有时您希望尽快给出足够好的解决方案,并在下一个版本中处理未来的棘手问题。

正如您问题下方评论中的人所建议的,最简单的验证方法是生成随机数据并测试查询执行时间。请注意,在dateColumn上使用聚集索引可以显著更改执行时间,因为“正如您问题下评论中的人所建议的,最简单的验证方法是生成随机数据并测试查询执行时间。请注意,在dateColumn上使用聚集索引可以显著更改执行时间,因为“您可以随机创建500万行并亲自查看。您可以通过插入随机数据轻松模拟500万行。既然你预计在2年内将达到200万台,那么你也应该预计到当你达到500万台时,将出现下一代硬件:)@dasblinkenlight:我同意你的评论,但请注意,增长并不总是如此linear@DanPichelman两年对于硬件的一代人来说已经足够了。事实上,根据一位非常著名的亿万富翁的说法,你所需要的只是:):)你可以随机创建500万行,自己看看。你可以通过插入随机数据轻松模拟500万行。既然你预计在2年内将达到200万台,那么你也应该预计到当你达到500万台时,将出现下一代硬件:)@dasblinkenlight:我同意你的评论,但请注意,增长并不总是如此linear@DanPichelman两年对于硬件的一代人来说已经足够了。事实上,根据一位非常著名的亿万富翁的说法,你所需要的只是:)::)在你的旁注上——这在代码中通常是正确的,但我觉得DBs是不同的。数据库中的过早优化实际上很少是过早的。在中流中更改DB模式比在中流中更改代码要困难得多。请注意,这在代码中通常是正确的,但我觉得DBs是不同的。数据库中的过早优化实际上很少是过早的。在中流中更改DB模式比在中流中更改代码要困难得多。