mysql分页功能的实现原理_高效的mysql分页方法及原理

更新时间:2023-05-11 20:31:43 阅读: 评论:0

mysql分页功能的实现原理_⾼效的mysql分页⽅法及原理⾸先看⼀下分页的基本原理:
mysql> explain SELECT * FROM message ORDER BY id DESC LIMIT 10000, 20G ***************** 1. row ************** id: 1
lect_type: SIMPLE table: message type: index possible_keys: NULL key: PRIMARY key_len: 4 ref: NULL rows: 10020 Extra: 1 row in t (0.00 c)
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 ASC LIMIT 20;
处理”下⼀页”的时候SQL语句可以是:
SELECT * FROM message WHERE id < 9500 ORDER BY id DESC LIMIT 20;
不管翻多少页,每次查询只扫描20⾏。
缺点是只能提供”上⼀页”、”下⼀页”的链接形式,但是我们的产品经理⾮常喜欢””这样的链接⽅式,怎么办呢?
如果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;
跳转到第13页:
SELECT * FROM message WHERE id < 9500 ORDER BY id DESC LIMIT 40,20;
原理还是⼀样,记录住当前页id的最⼤值和最⼩值,计算跳转页⾯和当前页相对偏移,由于页⾯相近,
这个偏移量不会很⼤,这样的话m值相对较⼩,⼤⼤减少扫描的⾏数。其实传统的limit m,n,相对的偏移⼀直是第⼀页,这样的话越翻到后⾯,效率越差,⽽上⾯给出的⽅法就没有这样的问题。
注意SQL语句⾥⾯的ASC和DESC,如果是ASC取出来的结果,显⽰的时候记得倒置⼀下。
已在60W数据总量的表中测试,效果⾮常明显。

本文发布于:2023-05-11 20:31:43,感谢您对本站的认可!

本文链接:https://www.wtabcd.cn/fanwen/fan/89/884765.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:提供   扫描   性能   时候   当前页
相关文章
留言与评论(共有 0 条评论)
   
验证码:
推荐文章
排行榜
Copyright ©2019-2022 Comsenz Inc.Powered by © 专利检索| 网站地图