分页查询优化

分页查询优化

当需要从数据库查询的表的数据量很庞大时,一次性查询全部记录的耗时可能会非常慢,而且,随着数据量的增多,会变得越来越耗时,这时候就需要使用到分页查询

简单分页

对于一般数据量不大,且对时间耗时不严格的业务,我们使用一般的简单分页查询就可以了

-- 跳过1000条记录,查询1000条,即一页1000条记录
select * from table limit 1000 offset 1000

我个人习惯是上边的写法,或者这样写也可以:

-- 第一个参数1000:即相当于offset,跳过1000条记录
-- 第二个参数10,即返回的记录数,如果第二个参数是-1即表示,查询到表结束
select * from table limit 1000,10

这种简单分页查询最大的弊端就是,随着页数的增加,即offset的增加,需要跳过的无用行的行数越来越多,而mysql也是需要扫描这些无用行的,即时间复杂度是

O(M + N):M:offset行数,N:结果记录行数

那么带来的问题就是,当offset的行数越来越多时,分页的时间复杂度也会随着线性上升

子查询优化

对于自增主键ID连续的表,

select * from table where id >= (select id from table limit #{offset},1) order by id limit #{pageSize}

或者利用其它索引也可以

select * from table where key >= (select key from table limit #{offset},1)order by key limit #{pageSize}

直接利用索引定位优化

select * table where id > (pageNum * pageSize ) limit pageSize

直接利用主键索引直接定位到指定偏移行,但是这种对数据连续型要求较高

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值