分页查询优化
当需要从数据库查询的表的数据量很庞大时,一次性查询全部记录的耗时可能会非常慢,而且,随着数据量的增多,会变得越来越耗时,这时候就需要使用到分页查询
简单分页
对于一般数据量不大,且对时间耗时不严格的业务,我们使用一般的简单分页查询就可以了
-- 跳过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
直接利用主键索引直接定位到指定偏移行,但是这种对数据连续型要求较高