分页查询limit 性能优化

分页查询在系统中是必不可少的sql 语句: select * from tabel limit 偏移量 , 条数

大部分人写分页查询都是简单的使用limit 如: select * from tabel limit 10 , 20 但是如果表示百万级数据呢?
 
偏移量 =  (页数-1) * 条数

现在测试一下54 万的表:
limit 0 ,10 – 0.007 秒
limit 100 ,10 – 0.008
limit 1000 ,10 – 0.012
limit 10000 ,10 – 0.017
limit 100000 ,10 – 0.107
limit 200000 ,10 – 0.208
limit 500000 ,10 – 0.533
这是只是使用limit 没有考虑其他因素,从上面时间上看可以发现随着偏移量的增大耗时越大。
从中我们可以知道:

  1. limit 语句的查询时间与起始记录的位置(偏移量)成正比
  2. mysql 的limit语句是非常的方便,但是对数据量非常大的表并不适合直接使用

针对以上limit效率问题的优化方法:

  • 利用索引
    众所周知利用索引查询的语句如果只包含索引列(覆盖索引),那么它查询的速度是非常快的
    **利用索引查询为什么快:**因为索引查找有优化算法,并且数据就在索引上面不用再去查找相关的数据地址了
    我们这里使用id 字段 是主键,自然也就包含了默认的索引:
    select * from customer t join (SELECT id from customer limit 500000 ,10 ) tc on t.id = tc.id -- 0.149 秒
    与上面相比相差了 4倍(这里数据量不多,相差时间不是很明显)
    另一种写法:(两者的原理都是一样的)
    select * from customer where id >=(SELECT id from customer limit 500000 , 1) limit 10

ok了!如有错误请指正!

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值