mysql分页原理和高效率的mysql分页查询语句
以前我在mysql中分页都是用的 limit 100000,20这样的方式,我相信你也是吧,要提高效率,让分页的代码效率更高一些,更快一些,那我们又该怎么做呢?
第一部分看一下分页的基本原理
mysql explain SELECT FROM message ORDER BY id DESC LIMIT 10000, 20
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)
对上面的mysql语句说明limit 10000,20的意思扫描满足条件的10020行,扔掉前面的10000行,返回的20行,问题就在这里,如果是limit 100000,100,需要扫描100100行,在一个高并发的应用里,每次查询需要扫描超过10W行,性能肯定大打折扣。文中还提到limit n性能是没问题的,因为只扫描n行。
第二部分根据雅虎的几位工程师带来了一篇Efficient Pagination Using MySQL的报告内容扩展在文中提到一种clue的做法,给翻页提供一些线索,比如还是SELECT FROM message ORDER BY id DESC,按id降序分页,每页20条,当前是第10页,当前页条目id最大的是1020,最小的是1000,如果我们只提供上一页、下一页这样的跳转(不提供到第N页的跳转),那么在处理上一页的时候SQL语句可以是
SELECT FROM message WHERE id>1020 ORDER BY id ASC LIMIT 20;//下一页
处理下一页的时候SQL语句可以是
SELECT FROM message WHERE id<1000 ORDER BY id DESC 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最大的是2519,最小的是2500;
当是第10页的SQL如下
SELECT FROM tb_goods_info WHERE auto_id >=2500 ORDER BY auto_id ASC LIMIT 0,20
比如要跳到第9页,SQL语句可以这样写
SELECT FROM tb_goods_info WHERE auto_id <2500 ORDER BY auto_id desc LIMIT 0,20
比如要跳到第8页,SQL语句可以这样写
SELECT FROM tb_goods_info WHERE auto_id <2500 ORDER BY auto_id desc LIMIT 20,20
比如要跳到第7页,SQL语句可以这样写
SELECT FROM tb_goods_info WHERE auto_id <2500 ORDER BY auto_id desc LIMIT 40,20
跳转到第11页
SELECT FROM tb_goods_info WHERE auto_id >2519 ORDER BY auto_id asc LIMIT 0,20
跳转到第12页
SELECT FROM tb_goods_info WHERE auto_id >2519 ORDER BY auto_id asc LIMIT 20,20
跳转到第13页
SELECT FROM tb_goods_info WHERE auto_id >2519 ORDER BY auto_id asc LIMIT 40,20
原理还是一样,记录住当前页id的最大值和最小值,计算跳转页面和当前页相对偏移,由于页面相近,这个偏移量不会很大,这样的话m值相对较小,大大减少扫描的行数。其实传统的limit m,n,相对的偏移一直是第一页,这样的话越翻到后面,效率越差,而上面给出的方法就没有这样的问题。
注意SQL语句里面的ASC和DESC,如果是ASC取出来的结果,显示的时候记得倒置一下。
已在60W数据总量的表中测试,效果非常明显
编程语言
- 如何快速学会编程 如何快速学会ug编程
- 免费学编程的app 推荐12个免费学编程的好网站
- 电脑怎么编程:电脑怎么编程网咯游戏菜单图标
- 如何写代码新手教学 如何写代码新手教学手机
- 基础编程入门教程视频 基础编程入门教程视频华
- 编程演示:编程演示浦丰投针过程
- 乐高编程加盟 乐高积木编程加盟
- 跟我学plc编程 plc编程自学入门视频教程
- ug编程成航林总 ug编程实战视频
- 孩子学编程的好处和坏处
- 初学者学编程该从哪里开始 新手学编程从哪里入
- 慢走丝编程 慢走丝编程难学吗
- 国内十强少儿编程机构 中国少儿编程机构十强有
- 成人计算机速成培训班 成人计算机速成培训班办
- 孩子学编程网上课程哪家好 儿童学编程比较好的
- 代码编程教学入门软件 代码编程教程