SQL 本体查询不慢 mybatis-plus 的分页功能 Count 总数巨慢

2020-09-29 10:02:35 +08:00
 DeathBless
SQL 本体是个多表联查
本来也挺慢的 后来 fouce index 主表 ID 后
查询速度大约只要 300 毫秒

但是用了 mybatis-plus 的自动分页后
他会在主 SQL 外套一个 count(1)来查询总数

本来也没什么问题 但是这个 sql 奇慢无比 大概要 6 秒
这是为什么 有啥办法优化吗🌚
6969 次点击
所在节点    MySQL
27 条回复
BBCCBB
2020-09-29 10:06:43 +08:00
不用他的 page 函数, 自己手动加上 offset limit.
zoharSoul
2020-09-29 10:07:37 +08:00
把 count 去掉.
大多数情况下 count 都没啥用, 分页最好换种方式
DeathBless
2020-09-29 10:27:34 +08:00
@zoharSoul 因为有查询条件 还不少 每张表都有 变了总数就要变😭
maigebaoer
2020-09-29 10:31:02 +08:00
page count join 耗性能的都被你用上了🤣
DeathBless
2020-09-29 10:36:10 +08:00
@maigebaoer 😂所以怎么办
ganbuliao
2020-09-29 10:46:41 +08:00
count(*)
zhaokun
2020-09-29 10:48:55 +08:00
他的原理是在你的 sql 外面包了一层 select count(*) from (你的 sql)
pierswu
2020-09-29 10:54:35 +08:00
可以 setSearchCount(false)去掉查询总数的,这种分页的需求,如果需求允许的话,不一定每一次翻页都要查一次总数。
aegon466
2020-09-29 10:56:34 +08:00
mp 分页还是要全部查出来再分页的 建议自己优化
zoharSoul
2020-09-29 11:55:07 +08:00
@DeathBless 总数给前端个 99999 得了
NPC666
2020-09-29 11:57:07 +08:00
试试用 pagehelper 进行分页?
aguesuka
2020-09-29 12:03:30 +08:00
前端要就手写,不要就不查。现代 sql 解释器查总数还要 6 秒说明 sql 有问题,该改改,该加索引加索引,该拆表拆表
aguesuka
2020-09-29 12:06:46 +08:00
查 count6 秒查数据 0.3 秒估计也做没排序吧?(或者是按主键)这样分页是有问题的
PhilC
2020-09-29 12:08:51 +08:00
@zoharSoul 我们之前就这么干的
cheng6563
2020-09-29 12:20:03 +08:00
数据多了分页要快要这样:
1.不查总数。
2.用主键按偏移量分页,这样会限制翻页数量,比如 where id > 2233 limit 20,10

最好是按日期,时间之类的字段加索引进行限制
zoharSoul
2020-09-29 13:26:57 +08:00
@PhilC #14
是啊, 常见做法, 一般 count 对于用户也没啥意义.

比如我刷 V2EX 也不关心总共多少帖子嘛
xgq89757
2020-09-29 14:38:17 +08:00
@zoharSoul 我们现在就这么干的。今天看到另外一个帖子,用 explan 里的行数,这个不精确,但妙啊
gundam0603
2020-09-29 14:42:05 +08:00
有的版本开始 count 可以手动写,自己写个去掉没有的子查询和关联,会快不少,再慢就只能加 count 的缓存了
xiaochong0302
2020-09-29 14:48:53 +08:00
@pierswu 那就要用自定义的分页组件了,其实 count 也可以缓存起来,离不开自定义
gundam0603
2020-09-29 14:52:19 +08:00
@xiaochong0302 直接写 Count 方法覆盖就行了,从某个版本开始就支持了,这种治标不治本,让产品看看需不需要总数吧 或者加条件什么的,数据量大了迟早会不行的

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

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

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

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

© 2021 V2EX