Mysql高效分页详解
前言
通常针对MySQL大数据量的查询采取“分页”策略,但是如果翻页到比较靠后的位置时查询将变得很慢,因为mysql将花费大量的时间来扫描需要丢弃的数据。
基本分页技巧
通常情况下,为了实现高效分页,需要在查询中WHERE条件列和排序列应用组合索引。
例如,建立索引(a,b,c)使得以下查询可以使用索引,提高查询效率:
1、字段排序
ORDERBYa ORDERBYa,b ORDERBYa,b,c ORDERBYaDESC,bDESC,cDESC
2、筛选和排序
WHEREa=constORDERBYb,c WHEREa=constANDb=constORDERBYc WHEREa=constORDERBYb,c WHEREa=constANDb>constORDERBYb,c
3、下面查询是无法使用以上索引的
ORDERBYaASC,bDESC,cDESC//排序方向不一致 WHEREg=constORDERBYb,c//字段g不是索引一部分 WHEREa=constORDERBYc//没有使用字段b WHEREa=constORDERBYa,d//字段d不是索引的一部分
解决大数据量翻页问题
1、将LIMITM,N的查询改为LIMITN
例如,使用LIMIT10000,20,Mysql将需要读取前10000行,然后获取后面的20行,这是非常低效的,使用LIMITN的方式,通过每页第一条或最后一条记录的id来做条件筛选,再配合降序和升序获得上/下一页的结果集。
2、限制用户翻页数量
产品实际使用过程中用户很少关心搜索结果的第1万条数据。
3、使用延迟关联
通过使用覆盖索引来查询返回需要的主键,再根据返回的主键关联原表获得需要的行,这样可以减少Mysql扫描那些需要丢弃的行数。
实例:
使用索引(sex,rating)进行查询:
mysql>SELECT<cols>FROMprofilesINNERJOIN( ->SELECT<primarykeycols>FROMprofiles ->WHEREx.sex='M'ORDERBYratingLIMIT100000,10 ->)ASxUSING(<primarykeycols>);
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。