MySql 数据统计很慢

a21768541 2019-12-18 03:41:14
现在有一个表,数据量比较大,有5000多万条数据。对于这个单表进行统计查询时,很慢,大概要20S左右

1.表payments字段比较多,有30多个字段
2.查询的where字段都有建立索引
3.userId 的值比较多,多的有上万个

SELECT IFNULL(sum(amount),0) as sum FROM `payments` WHERE cash = 1 and status = 1 and created_at<CURDATE() and userId in(123)

请问,这种情况应该怎么进行优化
...全文
198 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
a21768541 2019-12-24
  • 打赏
  • 举报
回复
userId 值太多,不使用in,我通过建立临时表,使用表外联的方式,速度快了很多
datafansbj 2019-12-19
  • 打赏
  • 举报
回复
无论什么数据库,5000万条数据进行统计都不会快,因为瓶颈不在 CPU、内存,而是在于磁盘。除非要统计的数据很少,且通过索引能很快从磁盘上读出来,否则那么多的数据,从磁盘读出来就需要花费很多的时间。
xiaoxiangqing 2019-12-19
  • 打赏
  • 举报
回复
需要去mysql版块提问
datafansbj 2019-12-19
  • 打赏
  • 举报
回复
引用 3 楼 a21768541 的回复:
[quote=引用 2 楼 datafansbj 的回复:] 无论什么数据库,5000万条数据进行统计都不会快,因为瓶颈不在 CPU、内存,而是在于磁盘。除非要统计的数据很少,且通过索引能很快从磁盘上读出来,否则那么多的数据,从磁盘读出来就需要花费很多的时间。
我不是统计所有的数据哦,会根据条件进行筛选... 我发现userId的值比较少的时候,是比较快的。 当userId超过上千了,就很慢了..[/quote] 假设该数据库占据磁盘空间为1GB,当条件筛选的 UserId 较少的时候,不需要扫描磁盘上的所有 1GB 区域,这样就较快;当 userId 较多的时候,需要扫描 1GB 的大部分区域,就慢下来了。如果你有固态硬盘,把数据库放在固态盘上会快很多的。
a21768541 2019-12-19
  • 打赏
  • 举报
回复
引用 2 楼 datafansbj 的回复:
无论什么数据库,5000万条数据进行统计都不会快,因为瓶颈不在 CPU、内存,而是在于磁盘。除非要统计的数据很少,且通过索引能很快从磁盘上读出来,否则那么多的数据,从磁盘读出来就需要花费很多的时间。
我不是统计所有的数据哦,会根据条件进行筛选... 我发现userId的值比较少的时候,是比较快的。 当userId超过上千了,就很慢了..

22,209

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧