为什么limit前面加上order by 索引查询性能会更好?

发布于 2022-09-04 18:19:03 字数 216 浏览 19 评论 0

为什么limit前面加上order by 索引查询性能会更好?
SELECT * FROM sys_client LIMIT 100000,10 耗时:0.0004
而:
SELECT * FROM sys_client ORDER BY id DESC LIMIT 100000,10
耗时:0.0001

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(5

拥抱没勇气 2022-09-11 18:19:03

找了个2千5百万数据的表进行测试,id是自增主键。

用下面语句进行测试,关query cache,每个连续跑10遍,计算平均耗时:

SELECT * FROM user_orders limit 100000,10;71.3ms
SELECT * FROM user_orders order by id desc limit 100000,10;83.4 ms
SELECT * FROM user_orders order by id asc limit 100000,10;69.3ms
SELECT * FROM user_orders limit 200000,10;133.2ms
SELECT * FROM user_orders order by id desc limit 200000,10;178.4 ms
SELECT * FROM user_orders order by id asc limit 200000,10;133.4ms
SELECT * FROM user_orders limit 10000000,10;6429.5ms
SELECT * FROM user_orders order by id desc limit 10000000,10;8270.9 ms
SELECT * FROM user_orders order by id asc limit 10000000,10;6918.7ms

limit offset小的时候,加order by走索引只扫少量行更快,而offset较大时,加order by会更慢,全表扫描反而会快。

趴在窗边数星星i 2022-09-11 18:19:03

如果不加索引,SELECT * FROM sys_client LIMIT 100000,10会将全表扫描,然后取第100001~100010这10条记录;
加了索引之后,就只检索100010条记录,而不是全表检索,所以执行效率会更好!

眸中客 2022-09-11 18:19:03

在第一条没有 order by 语句中,mysql 处理步骤是这样的:

  1. 根据语句取出 10 条数据;

  2. 对这十条数据进行排序;

  3. 返回这 10 条数据;

但是在第二条语句中,假设你的 id 字段为主键索引,mysql 处理步骤是这样的:

  1. 取出 10 条数据;

  2. 利用索引顺序直接取得已经排好序的数据;

  3. 返回这 10 条数据;

总结一下:
如果 order by 的字段在在执行中利用了索引。则可以利用索引顺序而直接取得已经排好序的数据。如果不是,才进行排序操作。

野稚 2022-09-11 18:19:03

你的id有加索引吧

绾颜 2022-09-11 18:19:03

0.0001…… 你需要验证复杂一点的sql

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文