1
chengyiqun 2022-08-26 17:39:25 +08:00
看你带条件了没, 条件是否走上索引了.
|
2
MoYi123 2022-08-26 17:44:47 +08:00
据我所知 pg 是没有的, mysql 应该也没有.
|
3
KouShuiYu 2022-08-26 17:46:45 +08:00
换成 count(1) 然后加上索引
|
4
pannanxu 2022-08-26 17:47:05 +08:00
据说这样子可以
explain select id from project 或者如果数据量准确度不需要太高,可以直接把查出来的数量丢进缓存 |
5
qq8331199 2022-08-26 17:47:50 +08:00
直接是没有办法的,就是慢
要么 redis 缓存这个 count ,先 count 一次,后面有增删,就去更新这个 count |
6
keepeye 2022-08-26 17:47:50 +08:00
正在显示第 0 - 24 行 (共 31392729 行, 查询花费 13.9842 秒。)
SELECT count(*) FROM `orders` rds 8 核 16g 高可用实例 |
7
sivacohan 2022-08-26 17:48:20 +08:00
select TABLE_ROWS from information_schema.TABLES where TABLE_SCHEMA = 'db' AND TABLE_NAME='tbl';
不要求准确性的话,可以这么查询。 |
8
keepeye 2022-08-26 17:50:09 +08:00
不求精确的话,并且能查询 mysql 库的话,可以读取 innodb_table_stats
|
9
westoy 2022-08-26 17:50:25 +08:00
缓存啊
不过我感觉你可能表设计有问题或者硬盘 IO 被拖爆了? 再怎么慢,5000 万数据 17S 也有点离谱啊....... |
10
bootvue 2022-08-26 17:51:15 +08:00
这个数据量是时候考虑考虑 es clickhouse 这些了
|
11
rqxiao OP 有 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> |
12
zibber 2022-08-26 17:53:38 +08:00
clickhouse
|
13
MoYi123 2022-08-26 17:55:57 +08:00
建议直接说服产品, 分页改成一页页翻, 用上一页的主键去查下一页, 然后行数大于 10000 行直接显示 10000+. 基本只能这么做.
|
14
tairan2006 2022-08-26 17:58:57 +08:00
改成下拉分页,别算总数了。
|
15
dwlovelife 2022-08-26 18:16:05 +08:00
用 mysql 一句话 无解, 要么改需求, 要么上别的数据库
|
17
makelove 2022-08-26 19:28:24 +08:00
先想明白你要的是什么,而不是怎么实现
5 千万级保证实现精确,这 tm 什么需求,造火箭都不需要这么高精度 |
18
djoiwhud 2022-08-26 19:46:27 +08:00 via Android
条件未命中索引,或者是结果集超比例,触发了全表扫描。
优化办法,优化 sql ,优化索引。如果是结果集超大,导致索引查询转全表扫描,需要考虑需求调整。或者是技术方案调整。 做数据冗余,规避汇总语句,也是可以的。 |
19
djoiwhud 2022-08-26 19:48:44 +08:00 via Android
不带条件的 sql ,别说五千万,就是一个亿,count *也可以快速查询出来。
这个问题换 count 1 没任何影响。 |
20
honamx 2022-08-26 20:09:00 +08:00
建组合索引试试,is_deleted, data_type, fileType, fileSource ,auditStatus
|
21
Red998 2022-08-26 20:26:45 +08:00
mysql 数据达到瓶颈了 、再怎么优化还是性能差的。考虑做数据切分 分表之类的。
|
22
chendl111 2022-08-26 20:43:21 +08:00 via Android
换 lykasm
|
23
bthulu 2022-08-26 21:07:33 +08:00
触发器啊, 新增一条满足查询条件的数据就记录+1, 删除一条就记-1. 后面只查这个记录数就行了, 1 毫秒都用不到就能精确返回
|
24
justanetizen 2022-08-26 21:16:42 +08:00
加个表或者缓存里存储该表的总数据数
|
25
pengtdyd 2022-08-26 21:17:53 +08:00
这不是技术的问题,这是产品的问题。
|
26
justanetizen 2022-08-26 21:20:07 +08:00
还有一个办法,用 insert 、delete 触发器
|
27
yousabuk 2022-08-26 21:21:27 +08:00 via iPhone
换 myisam
|
28
justanetizen 2022-08-26 21:31:10 +08:00
|
29
taogen 2022-08-26 21:35:05 +08:00
表结构、索引和 explain 贴一下啊
|
30
akira 2022-08-26 22:40:21 +08:00
产品问题,改成查最近一段时间的 数据,例如 30 天,7 天, 然后这样就可以走索引了。
|
31
hubahuba 2022-08-27 17:03:20 +08:00
这这这不分表
|
32
iseki 2022-08-27 21:51:12 +08:00 via Android
才 5000 万分啥表
|
33
KouShuiYu 2022-08-28 20:14:51 +08:00
检查下 where 条件是不是有类型转换之类的操作,之前有张表
conv_time :: date between :dateStart and :dateEnd 修改成了 conv_time between :dateStart and (date :dateEnd + interval '1 day' - interval '1 second') 查询时间直接从 3s 干到了 20ms |
34
CrazyMonkeyV 2022-08-29 16:54:09 +08:00
我们也遇到了这个问题,在特定需求下,近乎无解。
|
36
NoahVI 2022-09-09 15:24:48 +08:00
还是考虑用 es 吧
|