Mysql大数据量分页查询优化

今天遇到了一个列表分页查询很慢的接口

1. 分析列表查询语句

列表查询语句关联了大约5张表,最后sql打印了limit 0,20
将sql放到数据库执行,500ms,语句分析索引全部命中

所以慢这里并不是列表查询慢

2. 分析count(*)语句

打印sql日志,可以看到count(*)的执行耗时达到了18s

count()执行原理,这里可以参考 count(*)
存在非聚集索引的count(
)会比只有聚集索引的结果快。这里是因为聚集索引的叶子节点包含了完整数据,访问的页较多,即磁盘I/O较多

当然我这里不是这个原因,这里count() 关联了多张表,多张表关联查询会导致count()变慢(具体原因待深究,实验可得这个结论)

3. 优化count(*)

因为结果都是一一对一应,这里我们单独写count(*)语句(mybatis使用分页插件,可以增加一个 id_COUNT的描述,总页数会走这个sql)

最后优化的sql为:

select count(*) from a
<if test= "queryB != null">
inner join b on a.id = b.aId
</if>

这样可以大大优化count(*)的执行时间

4. 分页越往后越慢

可以参考下面sql的写法

select * from orders_history where type=8 and 
id>=(select id from orders_history where type=8 limit 100000,1) 
limit 100;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值