SQL优化 -- limit优化

问题:在使用limit分页查询时,已经使用了主键覆盖索引,为什么limit返回的结果仍然还是 ”乱序“ 的?

一,测试所用数据结构和内容

二,测试所用的主键索引

三,通过 select id from tb_user limit 10; 进行分页查询

我们发现返回的结果是乱序的,并没有按照我们想要的顺序返回

四,为什么会出现这种情况?

  1. 索引使用和结果排序的区别

    • 使用索引(Using index)表示数据库在查询过程中利用了索引来提高检索速度。
    • 结果排序(ORDER BY)是确保查询结果按特定列的顺序排列。
  2. EXPLAIN 输出的解读

    • key 列显示使用了 unique_user_username 索引。
    • type 列的值为 index,表示数据库通过扫描索引来检索数据,而不是按表的物理顺序。
  3. 默认排序

    • 默认情况下,LIMIT 子句并不保证结果的顺序。如果没有指定 ORDER BY,返回的结果顺序可能是基于索引的顺序,但这并不一定是你期望的顺序(例如 id 的顺序)。

五,如何确保结果按 id 排序?

为了确保结果按 id 排序,需要显式地使用 ORDER BY id。例如:

SELECT id FROM tb_test ORDER BY id LIMIT 0, 10;

示例和解释:

tb_test 包含如下数据:

idusername
1083user1
1241user2
1392user3
371user4
1242user5
1344user6
1260user7
190user8
1044user9
888user10

执行以下查询:

sql复制

SELECT id FROM tb_test ORDER BY id LIMIT 0, 10;

将确保返回结果按 id 升序排序,而不是根据存储或索引的顺序:

id
190
371
888
1044
1083
1241
1242
1260
1344
1392

六,总结

尽管查询使用了索引(Using index),但默认情况下,LIMIT 子句不会保证结果的顺序。要确保结果按 id 排序,必须显式地使用 ORDER BY id 子句。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值