【转】基于主键的分页查询优化

本文探讨了基于主键分页查询性能不佳的原因,并提出了三种解决方案:强制索引、调整排序字段以及组合排序方式,有效改善了查询效率。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

经常有人来问为什么基于主键的分页查询性能也会很差,看下面这个例子

SELECT * FROM T_Withdraw WHERE CreateTime >= "2018-01-12" AND "2018-01-23" > CreateTime AND PayState = 1 AND AutoId >= 0 ORDER BY AutoId limit 200 \G

 

一、第一个疑问是走主键不好吗?

MySQL会自动计算 cost,判断走哪条路最快,这种情况下做了错误的选择,走主键索引,排序确实是快了。但是 where条件全部走不到索引,相当于全表扫描了一次。SQL 跑起来巨慢无比。

二、如何走到正确的索引?

有两种方法:

1.force index,这种方法类似奇技淫巧,不到万不得已,一般不推荐使用。

 SELECT * FROM T_Withdraw force index(idx_PayState_CreateTime) WHERE CreateTime >= "2018-01-12" AND "2018-01-23" > CreateTime AND PayState = 1 AND AutoId >= 0 ORDER BY AutoId limit 200 \G

看下图,确实走到正确的索引了,速度也快了很多倍。

 

2.SELECT * FROM T_Withdraw  WHERE CreateTime >= "2018-01-12" AND "2018-01-23" > CreateTime AND PayState = 1 AND AutoId >= 0 ORDER BY CreateTime limit 200 \G 

如果我们把 order by AutoId 改成 order by CreateTime,就可以走上正确的索引,这种方式的弊端是 CreateTime 分页可能会有重复,无法满足业务需求。

 

3.最后,其实我们调整一下 order by 的字段,这个问题就解了。

SELECT * FROM T_Withdraw  WHERE CreateTime >= "2018-01-12" AND "2018-01-23" > CreateTime AND PayState = 1 AND AutoId >= 0 ORDER BY CreateTime,AutoId limit 200 \G 

把 order by 调整为 CreateTime 相同的情况下再按 AutoId 排序,就可以解决这个问题了。也不需要 force index

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值