PERCONA PERFORMANCE CONFERENCE 2009上,来自雅虎的几位工程师带来了一篇”Efficient Pagination Using MySQL“的报告,有很多亮点,本文是在原文基础上的进一步延伸。
首先看一下分页的基本原理:
mysql> explain SELECT * FROM message ORDER BY id DESC LIMIT 10000, 20\G
***************** 1. row **************
id: 1
select_type: SIMPLE
table: message
type: index
possible_keys: NULL
key: PRIMARY
key_len: 4
ref: NULL
rows: 10020
Extra:
1 row in set (0.00 sec)
limit 10000,20的意思扫描满足条件的10020行,扔掉前面的10000行,返回最后的20行,问题就在这里,如果是limit 100000,100,需要扫描100100行,在一个高并发的应用里,每次查询需要扫描超过10W行,性能肯定大打折扣。文中还提到limit n性能是没问题的,因为只扫描n行。
文中提到一种”clue”的做法,给翻页提供一些”线索”,比如还是SELECT * FROM message ORDER BY id DESC,按id降序分页,每页20条,当前是第10页,当前页条目id最大的是9527,最小的是9500,如果我们只提供”上一页”、”下一页”这样的跳转(不提供到第N页的跳转),那么在处理”上一页”的时候SQL语句可以是:
SELECT * FROM message WHERE id > 9527 ORDER BY id ASCLIMIT 20;
处理”下一页”的时候SQL语句可以是:
SELECT * FROM message WHERE id < 9500 ORDER BY idDESC LIMIT 20;
不管翻多少页,每次查询只扫描20行。
缺点是只能提供”上一页”、”下一页”的链接形式,但是我们的产品经理非常喜欢”<上一页 1 2 3 4 5 6 7 8 9 下一页>”这样的链接方式,怎么办呢?
如果LIMIT m,n不可避免的话,要优化效率,只有尽可能的让m小一下,我们扩展前面的”clue”做法,还是SELECT * FROM message ORDER BY id DESC,按id降序分页,每页20条,当前是第10页,当前页条目id最大的是9527,最小的是9500,比如要跳到第8页,我看的SQL语句可以这样写:
SELECT * FROM message WHERE id > 9527 ORDER BY id ASCLIMIT 20,20;
跳转到第13页:
SELECT * FROM message WHERE id < 9500 ORDER BY idDESC LIMIT 40,20;
原理还是一样,记录住当前页id的最大值和最小值,计算跳转页面和当前页相对偏移,由于页面相近,这个偏移量不会很大,这样的话m值相对较小,大大减少扫描的行数。其实传统的limit m,n,相对的偏移一直是第一页,这样的话越翻到后面,效率越差,而上面给出的方法就没有这样的问题。
注意SQL语句里面的ASC和DESC,如果是ASC取出来的结果,显示的时候记得倒置一下。
已在60W数据总量的表中测试,效果非常明显。
转自:http://www.fuchaoqun.com/2009/04/efficient-pagination-using-mysql/
分享到:
相关推荐
亲测,可用,vs2010 winform mysql 分页 你值得拥有
JDBC-MySQL分页查询,jsp为显示的页面
不错的struts2+MySQL分页 struts2+MySQL分页
PHP+MySql分页显示示例分析 PHP+MySql分页显示示例分析
struts2 +mysql 分页显示 源码struts2 +mysql 分页显示 源码
Mysql分页通用存储过程
page ssm mysql 分页查询 绝对的强大
PHP和MYSQL分页代码,带有数据库. 可以实现数据分页
一个封装好的php+mysql分页类,分页显示MySQL数据库中的数据,根据SQL查询语句从表中读取相应的记录,显示首页、下页、上页、未页。
MYSQL分页存储过程 非常实用的东西哦 希望大家能用上
MySql 分页 存储过程 MySql 分页 存储过程 MySql 分页 存储过程
PHP+mysql分页原理和实例应用.pdf
到此这篇关于mysql分页的limit参数的文章就介绍到这了,更多相关mysql分页limit参数内容请搜索软件开发网以前的文章或继续浏览下面的相关文章希望大家以后多多支持软件开发网! 您可能感兴趣的文章:详解MySQL的limit...
java-web-mysql 分页demo,并附有sql文件,导入既可以使用!
ASP下查询MYSQL数据库的内容并对结果分页。 相当经典的一个代码。
利用easyUI结合MySQL数据库实现分页效果,使用DataGrid.html模板
PHP+MYSQL分页代码
mysql分页查询
QQ:510876005
自己写的一个通用分页工具.是基于hibernate mysql struts2 写的.直接可以部署到tomcat 运行 欢迎指正