在mysql中翻页是不是有比LIMIT OFFSET更好的选择
阿神
阿神 2017-04-17 10:58:12
[MySQL讨论组]

以前在数据中写翻页的代码时,一直把sql写成这样

SELECT * FROM table_name ORDER BY id ASC LIMIT 10 OFFSET 10

也就是用LIMITOFFSET来控制需要输出的内容区域,后来我在翻其他人代码时看到了这种写法

SELECT * FROM table_name WHERE id > 10 ORDER BY id ASC LIMIT 10

这种写法是否比前一种写法的速度要更快,因我看到它使用id主键的索引,而且还把检索区域用id > 10缩小了,理论上应该更快。但这种写法应该也有一定的局限性,比如最大的局限就是它只能用于那种类似timeline的,从第一页往后翻的应用场景,因为你要翻下一页必须知道前一页的最后偏移是多少。

不知道我这样的分析是否正确,各位有什么样的看法。

阿神
阿神

闭关修行中......

全部回复(4)
ringa_lee

MySQL里对LIMIT OFFSET的处理方式是,取出OFFSET+LIMIT的所有数据,然后去掉OFFSET,返回底部的LIMIT。
所以,在OFFSET数值较大时,MySQL的查询性能会非常低。

SELECT * FROM table_name ORDER BY id ASC LIMIT 10 OFFSET 10

MySQL会取出20条数据,只返回后10条。

SELECT * FROM table_name WHERE id > 10 ORDER BY id ASC LIMIT 10

利用id索引,MySQL只取出10个结果,返回。这种做法却是要求连续翻页,不能跳页,受约束。

PHP中文网

暂时没有更好选择,where id > :id的方式局限性太大,id不一定是连续的,翻页也不见得是根据主键来翻。

limit offset从功能上来讲是非常好的,如果担心offset过大时耗时太长,可以分库分表。或者用搜索引擎

PHPz

楼主的理解是对的。用id>m limit n 比用 limit m,n 快很多,主要原因是limit m,n需要去读取前面的m条记录。
如果是翻页需求,就在返回结果中取到最后的一个,再传给下一个链接。 @Rodin 给的方案就很好。

高洛峰

可以两种方式相结合,id>x limit m,n

热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号