MySQL limit分页的性能问题

今天在学习MyBatis分页插件的时候,在别人博客看到这样的一句话

 博客地址:https://www.cnblogs.com/kangoroo/p/7998433.html

当时看到这话觉得挺不可思议,觉得这不符合自己的认知。那就开始实际测试看看。

数据库有1000021条数据,id设为主键索引的情况下测试结果如下

alter table indextable add primary key(id)
show keys from indextable
reset query cache	 

explain select * from indextable	-- 查询1000012 用时2.437s type:ALL

explain select * from indextable limit 1000011,1	-- 查询1000012中的最后一条数据 用时0.333s type:ALL

explain select * from indextable limit 0,1000		-- 查询1000012中的前一千条数据 用时0.0008s type:ALL

explain select * from indextable limit 999012,1000	-- 查询1000012中的后一千条数据 用时0.321s type:ALL

reset query cache	-- 清空缓存

explain select -- 查询1000012中的后一千条数据 用时0.247s 主查询-type:eq_ref row=1 子查询-type:index Extra:Using inedx
  indextable.`id`,
  indextable.`name`,
  indextable.`sex`
from indextable
inner join (
	select id from indextable
	order by id limit 999012,1000
) tb_indextable 
on indextable.`id` = tb_indextable.`id`


explain select --  查询1000012中的最后一条数据 用时0.243s 主查询-type:const row=1 子查询-type:index Extra:Using inedx
  indextable.`id`,
  indextable.`name`,
  indextable.`sex`
from indextable
inner join (
	select id from indextable
	order by id limit 1000011,1
) tb_indextable 
on indextable.`id` = tb_indextable.`id`

 前四条的测试结果在我个人看来有两种结果,1.limit不是过滤1000021条数据取最后一条 2.limit是过滤1000021条数据取最后一条,但limit本身做了优化

对于这样的结果我们是不满意的。即便是查询中间的、后面的数据,我们都想像查询前N条数据快速,所以后面两条测试是一种优化方案。

建立索引,并且使查询语句使用索引,这是优化方案的思想。

当然,没有主键索引的情况下,优化方案是行不通的。结果如下:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值