mysql 单表 5 千万的数据量 , count(*) 耗时很长有办法优化吗

2022-08-26 17:37:25 +08:00
 rqxiao
单表 5 千万 现在 count(*) 要 17s 左右
4887 次点击
所在节点    MySQL
36 条回复
chengyiqun
2022-08-26 17:39:25 +08:00
看你带条件了没, 条件是否走上索引了.
MoYi123
2022-08-26 17:44:47 +08:00
据我所知 pg 是没有的, mysql 应该也没有.
KouShuiYu
2022-08-26 17:46:45 +08:00
换成 count(1) 然后加上索引
pannanxu
2022-08-26 17:47:05 +08:00
据说这样子可以

explain select id from project

或者如果数据量准确度不需要太高,可以直接把查出来的数量丢进缓存
qq8331199
2022-08-26 17:47:50 +08:00
直接是没有办法的,就是慢
要么 redis 缓存这个 count ,先 count 一次,后面有增删,就去更新这个 count
keepeye
2022-08-26 17:47:50 +08:00
正在显示第 0 - 24 行 (共 31392729 行, 查询花费 13.9842 秒。)
SELECT count(*) FROM `orders`

rds 8 核 16g 高可用实例
sivacohan
2022-08-26 17:48:20 +08:00
select TABLE_ROWS from information_schema.TABLES where TABLE_SCHEMA = 'db' AND TABLE_NAME='tbl';

不要求准确性的话,可以这么查询。
keepeye
2022-08-26 17:50:09 +08:00
不求精确的话,并且能查询 mysql 库的话,可以读取 innodb_table_stats
westoy
2022-08-26 17:50:25 +08:00
缓存啊

不过我感觉你可能表设计有问题或者硬盘 IO 被拖爆了? 再怎么慢,5000 万数据 17S 也有点离谱啊.......
bootvue
2022-08-26 17:51:15 +08:00
这个数据量是时候考虑考虑 es clickhouse 这些了
rqxiao
2022-08-26 17:52:09 +08:00
有 where 条件的,而且还比较多

SELECT COUNT(1) FROM tb_task
<where>
AND is_deleted = 0
AND data_type != 1
<if test="fileType != null and fileType != ''"> AND file_type = #{fileType}</if>
<if test="fileSource != null"> AND file_source = #{fileSource}</if>
<if test="auditStatus != null"> AND review_status = #{auditStatus}</if>
<if test="auditStatus != null"> AND analysis_status = 2</if>
zibber
2022-08-26 17:53:38 +08:00
clickhouse
MoYi123
2022-08-26 17:55:57 +08:00
建议直接说服产品, 分页改成一页页翻, 用上一页的主键去查下一页, 然后行数大于 10000 行直接显示 10000+. 基本只能这么做.
tairan2006
2022-08-26 17:58:57 +08:00
改成下拉分页,别算总数了。
dwlovelife
2022-08-26 18:16:05 +08:00
用 mysql 一句话 无解, 要么改需求, 要么上别的数据库
CEBBCAT
2022-08-26 18:44:54 +08:00
@KouShuiYu #3 真佩服,能一下子猜到楼主是附带了 WHERE 的计数👍
makelove
2022-08-26 19:28:24 +08:00
先想明白你要的是什么,而不是怎么实现
5 千万级保证实现精确,这 tm 什么需求,造火箭都不需要这么高精度
djoiwhud
2022-08-26 19:46:27 +08:00
条件未命中索引,或者是结果集超比例,触发了全表扫描。

优化办法,优化 sql ,优化索引。如果是结果集超大,导致索引查询转全表扫描,需要考虑需求调整。或者是技术方案调整。

做数据冗余,规避汇总语句,也是可以的。
djoiwhud
2022-08-26 19:48:44 +08:00
不带条件的 sql ,别说五千万,就是一个亿,count *也可以快速查询出来。
这个问题换 count 1 没任何影响。
honamx
2022-08-26 20:09:00 +08:00
建组合索引试试,is_deleted, data_type, fileType, fileSource ,auditStatus

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/875652

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX