浅谈mysql使用limit分页优化方案的实现

网络编程 2021-07-05 14:37www.168986.cn编程入门
在mysql中limit可以实现快速分页,如果数据到了几百万时我们的limit必须优化才能有效的合理的实现分页了,否则可能卡死你的服务器哦。感兴趣的可以一起来了解一下如何实现优化

Mysql limit分页语句用法

与Oracle和MS SqlServer相比,mysql的分页方法简单的让人想哭。

--语法

SELECT  FROM table LIMIT [offset,] rows | rows OFFSET offset

--举例

select  from table limit 5; --返回前5行

select  from table limit 0,5; --同上,返回前5行

select  from table limit 5,10; --返回6-15行

如何优化limit

当一个查询语句偏移量offset很大的时候,如select from table limit 10000,10 , 最好不要直接使用limit,而是先获取到offset的id后,再直接使用limit size来获取数据。效果会好很多。

select  From customers Where customer_id >=(
select customer_id From customers Order By customer_id limit 10000,1
) limit 10;

一、测试实验

mysql分页直接用limit start, count分页语句

select  from product limit start, count

当起始页较小时,查询没有性能问题,我们分别看下从10, 100, 1000, 10000开始分页的执行时间(每页取20条),如下

select  from product limit 10, 20 0.016秒
select  from product limit 100, 20 0.016秒
select  from product limit 1000, 20 0.047秒
select  from product limit 10000, 20 0.094秒

我们已经看出随着起始记录的增加,时间也随着增大, 这说明分页语句limit跟起始页码是有很大关系的,
那么我们把起始记录改为40w看下(也就是记录的一半左右)

select  from product limit 400000, 20 3.229秒

再看我们取一页记录的时间

select  from product limit 866613, 20 37.44秒

像这种分页最大的页码页显然这种时间是无法忍受的。

从中我们也能出两件事情

  • limit语句的查询时间与起始记录的位置成正比。
  • mysql的limit语句是很方便,对记录很多的表并不适合直接使用。

二、 对limit分页问题的性能优化方法

2.1 利用表的覆盖索引来加速分页查询

我们都知道,利用了索引查询的语句中如果只包含了那个索引列(覆盖索引),那么这种情况会查询很快。

因为利用索引查找有优化算法,且数据就在查询索引上面,不用再去找相关的数据地址了,这样节省了很多时间。

Mysql中也有相关的索引缓存,在并发高的时候利用缓存就效果更好了。

在我们的例子中,我们知道id字段是主键,自然就包含了默认的主键索引。现在让我们看看利用覆盖索引的查询效果如何
这次我们之间查询一页的数据(利用覆盖索引,只包含id列),如下

select id from product limit 866613, 20 

查询时间为0.2秒,相对于查询了所有列的37.44秒,提升了大概100多倍的速度。

那么如果我们也要查询所有列,有两种方法,

id>=的形式

SELECT  FROM product 
WHERE ID > =(select id from product limit 866613, 1) limit 20

查询时间为0.2秒,简直是一个质的飞跃啊。

利用join

SELECT  FROM product a 
JOIN (select id from product limit 866613, 20) b ON a.ID = b.id

查询时间也很短,赞!

其实两者用的都是一个原理嘛,所以效果也差不多。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持狼蚁SEO。

Copyright © 2016-2025 www.168986.cn 狼蚁网络 版权所有 Power by