
1 C02TobNClov1Dz56 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 PRO 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 吧 |