问题:在使用limit分页查询时,已经使用了主键覆盖索引,为什么limit返回的结果仍然还是 ”乱序“ 的?
一,测试所用数据结构和内容
二,测试所用的主键索引
三,通过 select id from tb_user limit 10; 进行分页查询
我们发现返回的结果是乱序的,并没有按照我们想要的顺序返回
四,为什么会出现这种情况?
-
索引使用和结果排序的区别:
- 使用索引(
Using index
)表示数据库在查询过程中利用了索引来提高检索速度。 - 结果排序(
ORDER BY
)是确保查询结果按特定列的顺序排列。
- 使用索引(
-
EXPLAIN 输出的解读:
key
列显示使用了unique_user_username
索引。type
列的值为index
,表示数据库通过扫描索引来检索数据,而不是按表的物理顺序。
-
默认排序:
- 默认情况下,
LIMIT
子句并不保证结果的顺序。如果没有指定ORDER BY
,返回的结果顺序可能是基于索引的顺序,但这并不一定是你期望的顺序(例如id
的顺序)。
- 默认情况下,
五,如何确保结果按 id
排序?
为了确保结果按 id
排序,需要显式地使用 ORDER BY id
。例如:
SELECT id FROM tb_test ORDER BY id LIMIT 0, 10;
示例和解释:
表 tb_test
包含如下数据:
id | username |
---|---|
1083 | user1 |
1241 | user2 |
1392 | user3 |
371 | user4 |
1242 | user5 |
1344 | user6 |
1260 | user7 |
190 | user8 |
1044 | user9 |
888 | user10 |
执行以下查询:
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
子句。