mysql常见的几种分页方式及性能

  

本文主要给大家简单讲讲mysql常见的几种分页方式及性能,相关专业术语大家可以上网查查或者找一些相关书籍补充一下,这里就不涉猎了,我们就直奔主题吧,希望mysql常见的几种分页方式及性能这篇文章可以给大家带来一些实际帮助又是;,,,,,,,,,,,,,,,,,,,,,,,,,,,,,

常见的几种分页方式:

1。扶梯方式

 mysql常见的几种分页方式及性能

扶梯方式在导航上通常只提供上一页/下一页这两种模式,部分产品甚至不提供上一页功能,只提供一种“更多/多”的方式,也有下拉自动加载更多的方式,在技术上都可以归纳成扶梯方式。
扶梯方式在技术实现上比较简单及高效,根据当前页最后一条的偏移往后获取一页即可。写成SQL可能类似

 SELECT * FROMLIST_TABLEWHEREid>offset_id限制n; 

1。电梯方式

 mysql常见的几种分页方式及性能

另外一种数据获取方式在产品上体现成精确的翻页方式,如1、2、3……n,同时在导航上也可以由用户输入直达n页。国内大部分场景采用电梯方式,但电梯方式在技术实现上相对成本较高。

在mysql中,通常提到的b -树,在存储引擎实现上,通常都是b +树。

使用电梯方式时候,当用户指定翻到第n页时候,并没有直接方法寻址到该位置,而是需要从第一楼逐个计数,扫描到数*页面时候,获取数据才真正开始,所以导致效率不高。

传统分页技术(电梯方式)

首先前端需要传给你的分页实体,以及查询条件

//分页实体
  structFinanceDcPage {
  1:手机等页大小,//页容量
  2:手机等pageIndex,//当前页索引
  }

然后你需要返回查询总条数给前端;

 SELECTCOUNT (*) FROMmy_tableWHEREx=y ORDERBYid; 

然后再返回指定页面条数给前端:

 SELECT * FROMmy_tableWHEREx=y ORDERBYdate_colLIMIT (pageIndex - 1) *页大小,页大小;

由上面两条sql语句查询出来的结果需要返回给前端的分页实体,以及单页结果集

//分页实体
  structFinanceDcPage {
  1:手机等页大小,//页容量
  2:手机等pageIndex,//当前页索引
  3:手机等pageTotal,//总页数
  4:手机等totalRecod,//总条数
  }

传统查询方法,每次请求变化的只有pageIndex值,也就是限制抵消,num的抵消

0,如限制10;限制10、10;…。limit10000 10;

上面的变化会导致每次查询所执行的时间会有偏差,抵消值越大需要的时间越长,如limit10000, 10需要读取10010个数据才能得到想要的10条数据。

优化方法

传统方法中我们了解到,影响效率的关键是程序遍历了许多不需要的数据,找到了关键点那么就从这里着手。

如果没有必须使用电梯方式的时候,我们可以使用扶梯的方式,来提高性能。

但是大多数情况,电梯形式更能满足用户的需求,所以我们就需要另找方法来优化电梯形式。

基于传统方式的优化

上面提到的优化方式,要么难以满足用户的需求,要么实现起来过于复杂,所以如果数据量不是特别大的时候,像百来万条数据,其实根本没有必要使用上面的优化方法。

传统方法已经足够用了,只不过传统方法也可能需要优化的地方,例如:

orderby优化

 SELECT * FROMpa_dc_flowORDERBYsubject_codeDESCLIMIT100000, 5 

这条语句中使用了orderby关键字,那么对什么进行排序又非常重要了,如果你是对自增id进行排序的话,那么这条语句就不需要优化了,如果是索引甚至非索引的话,那就需要优化了。

首先你要保证它是索引,不然真的会很慢。然后如果他是索引,但是本身不像自增id那样有序的话,那么就要改写成下面的语句。

 SELECT * FROMpa_dc_flowINNERJOIN (SELECTidFROMpa_dc_flowORDERBYsubject_codeDESCLIMIT100000, 5) ASpa_dc_flow_idUSING (id); 

下面是对两条sql的解释

 mysql常见的几种分页方式及性能“> <br/> </p> <p> <img src=

由图中我们可以看的出,第二个sql可以少扫面很多页面。

其实这涉及到命令的优化问题,第一条sql中并没有利用到subject_code索引。如果你改为选择subject_code…则用到了索引。下面是对命令的优化。

mysql常见的几种分页方式及性能