MySQL的limit使用及解决超大分页问题

前言

平常开发中,咱们使用mysql来实现分页功能的时候,老是会用到mysql的limit语法.而怎么使用却颇有讲究的,今天来总结一下.mysql

limit语法

limit语法支持两个参数,offsetlimit,前者表示偏移量,后者表示取前limit条数据.sql

例如:性能

## 返回符合条件的前10条语句 
select * from user limit 10

## 返回符合条件的第11-20条数据
select * from user limit 10,20
复制代码

从上面也能够看出来,limit n 等价于limit 0,n.学习

性能分析

实际使用中咱们会发现,在分页的后面一些页,加载会变慢,也就是说:测试

select * from user limit 1000000,10 语句执行较慢.那么咱们首先来测试一下.优化

首先是在offset较小的状况下拿100条数据.(数据总量为200左右).而后逐渐增大offset.url

select * from user limit 0,100 ---------耗时0.03s
select * from user limit 10000,100 ---------耗时0.05s
select * from user limit 100000,100 ---------耗时0.13s
select * from user limit 500000,100 ---------耗时0.23s
select * from user limit 1000000,100 ---------耗时0.50s
select * from user limit 1800000,100 ---------耗时0.98s
复制代码

能够看到随着offset的增大,性能愈来愈差.spa

这是为何呢?由于limit 10000,10的语法其实是mysql查找到前10010条数据,以后丢弃前面的10000行,这个步骤实际上是浪费掉的.code

优化

用id优化

先找到上次分页的最大ID,而后利用id上的索引来查询,相似于select * from user where id>1000000 limit 100.cdn

这样的效率很是快,由于主键上是有索引的,可是这样有个缺点,就是ID必须是连续的,而且查询不能有where语句,由于where语句会形成过滤数据.

用覆盖索引优化

mysql的查询彻底命中索引的时候,称为覆盖索引,是很是快的,由于查询只须要在索引上进行查找,以后能够直接返回,而不用再回数据表拿数据.所以咱们能够先查出索引的ID,而后根据Id拿数据.

select * from (select id from job limit 1000000,100) a left join job b on a.id = b.id;
复制代码

耗时0.2秒.

总结

用mysql作大量数据的分页确实是有难度,可是也有一些方法能够进行优化,须要结合业务场景多进行测试.

当用户翻到10000页的时候,不如咱们直接返回空好了,这么无聊的吗...


完。



ChangeLog

2019-05-25 完成

**以上皆为我的所思所得,若有错误欢迎评论区指正。**

欢迎转载,烦请署名并保留原文连接。

联系邮箱:huyanshi2580@gmail.com

更多学习笔记见我的博客------>呼延十

相关文章
相关标签/搜索