MySQL分页使用limit和offset参数,为什么会导致执行变慢?

五年前在tx,1 0w数据分页非常慢,2 -3 秒。

导师询问索引场景中第n大数的时间复杂度。
Tieu Bach 错误地猜出了 log(N)。

实际mysql B+树叶子节点链表,O(N)找到第1 00大的数。

但是 O(N) 不应该太慢。
Key为二级索引+随机IO主键聚簇索引。

限制/偏移量位于引擎层,服务器层将丢弃前 1 0,000 个条目。

分页慢的原因:IO+随机索引+聚集索引机制。

我们看三年后的源码,逻辑运算符 etcd/tidb SPJ。

未优化的查询计划:数据源拉-数据-连接-选择-投影。

限制/偏移无法下载到工具类,因为它被逻辑运算符分割。

解决方案1 :使用后端索引id分页,并且需要将id反馈给前端。

解决方案 2 :索引覆盖率。
先检查id,然后用id检查聚集索引。

1 0 个随机 IO 与 1 0,000 个随机 IO。

深入思考小问题,快速提高你的技术。

MySQL深分页问题原理与三种解决方案

这就是陷阱:深度分页会导致性能下降。

方案一:限制查询页面数量,降低相关性。

方案二:优化SQL并查看执行计划。

方案3 :使用Id分页来提高效率。

实用提醒:测试优化前后的性能差异。

mysql更新1000w级别数据分页查询后面的页数越耗时

MYSQL分页limit速度太慢的优化方法

直接使用 LIMIT offset 和 LENGTH 速度较慢,因为您必须跳过多个偏移行。

快速使用最后一个大ID。
比如上一页最后一个ID是1 00,这次检查的是1 01 到1 1 0项,SQL是:SELECT FROM users WHERE ID > 1 00 ORDER BY ID LIMIT 1 0;请记住向 id 列添加索引。

子查询也可以工作。
例如,查看第 1 00 页,每页 1 0 条: SELECT FROM users WHERE id > (SELECT id FROM users WHERE id LIMIT 9 9 9 0, 1 ) LIMIT 1 0;子查询应该很快。

反转列表非常慢但稳定。
新建一个表,记录每页的第一个和最后一个ID。
结帐时加入此表。
不要使用它。

一半以上的信息使用反向搜索。
例如查看第1 00页,第1 0000页有1 0条记录,总记录数为1 0000条: SELECT ORDER BY id DESC LIMIT 9 9 0, 1 0;然后改变顺序。
了解整体很重要。

不要使用非常大的偏移量。
例如赔偿金额超过5 00万,则直接返回空白结果。
用户页面一般不超过2 00个。

称一下体重。