MySQL分页分析原理及提高效率
16lz
2021-12-31
MySQL分页分析原理及提高效率
PERCONA PERFORMANCE CONFERENCE 2009上,来自雅虎的几位工程师带来了一篇”Efficient Pagination Using MySQL“的报告,有很多亮点,本文是在原文基础上的进一步延伸。
首先看一下分页的基本原理:
MySQL> explain SELECT * FROM message ORDER BY id DESC LIMIT 10000, 20\G***************** 1. row **************id: 1select_type: SIMPLEtable: messagetype: indexpossible_keys: NULLkey: PRIMARYkey_len: 4ref: NULLrows: 10020Extra:1 row in set (0.00 sec)
文中提到一种”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 ASC LIMIT 20;
SELECT * FROM message WHERE id < 9500 ORDER BY id DESC LIMIT 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 ASC LIMIT 20,20;
SELECT * FROM message WHERE id < 9500 ORDER BY id DESC LIMIT 40,20;
注意SQL语句里面的ASC和DESC,如果是ASC取出来的结果,显示的时候记得倒置一下。
已在60W数据总量的表中测试,效果非常明显。
感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!
更多相关文章
- android分页查询获取系统联系人信息
- Android入门教程(三十一)------SQLite分页读取
- android ListView的分段显示、分页显示(附源码)
- android左右滑动加载分页以及动态加载数据
- Android(安卓)listview怎么实现滚动分页
- Android(安卓)ListView专题之十二 分页不同的解决方案
- Android分页控件xlistview
- android中滑动SQLite数据库分页加载
- Android(安卓)分页组件