You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
@@ -64,15 +66,20 @@ SELECT * FROM t_order WHERE id > 100000 LIMIT 10
64
66
65
67
```sql
66
68
-- 先通过子查询在主键索引上进行偏移,快速找到起始ID
67
-
SELECT*FROM t_order WHERE id >= (SELECT id FROM t_order LIMIT1000000, 1) LIMIT10;
69
+
SELECT*FROM t_order
70
+
WHERE id >= (
71
+
SELECT id FROM t_order ORDER BY id LIMIT1000000, 1
72
+
) ORDER BY id LIMIT10;
68
73
```
69
74
70
75
**工作原理**:
71
76
72
-
1. 子查询 `(SELECT id FROM t_order where id > 1000000 limit 1)` 会利用主键索引快速定位到第 1000001 条记录,并返回其 ID 值。
73
-
2. 主查询 `SELECT * FROM t_order WHERE id >= ... LIMIT 10` 将子查询返回的起始 ID 作为过滤条件,使用 `id >=` 获取从该 ID 开始的后续 10 条记录。
77
+
1. 子查询 `(SELECT id FROM t_order ORDER BY id LIMIT 1000000, 1)` 利用主键索引扫描并跳过前 1000000 条记录,返回第 1000001 条记录的主键值。
78
+
2. 主查询 `SELECT * FROM t_order WHERE id >= ... ORDER BY id LIMIT 10` 以该主键为起点,获取后续 10 条完整记录。
79
+
80
+
不过,某些情况下子查询可能会产生临时表,影响性能,因此在复杂查询中建议优先考虑延迟关联。
74
81
75
-
不过,子查询的结果会产生一张新表,会影响性能,应该尽量避免大量使用子查询。并且,这种方法只适用于 ID 是正序的。在复杂分页场景,往往需要通过过滤条件,筛选到符合条件的 ID,此时的 ID 是离散且不连续的。
82
+
> **复杂过滤场景**:在包含复杂过滤条件的分页场景中(如 `WHERE status = 1 ORDER BY id LIMIT 1000000, 10`),符合条件的 ID 往往是离散的。此时子查询的优势更加明显:通过在子查询中利用联合索引(如 `(status, id)`)实现覆盖索引扫描,可以高效地跳过前 100 万条符合条件的记录,定位到目标 ID 后,主查询只需回表 10 次。
76
83
77
84
当然,我们也可以利用子查询先去获取目标分页的 ID 集合,然后再根据 ID 集合获取内容,但这种写法非常繁琐,不如使用 INNER JOIN 延迟关联。
78
85
@@ -86,22 +93,24 @@ SELECT t1.*
86
93
FROM t_order t1
87
94
INNER JOIN (
88
95
-- 这里的子查询可以利用覆盖索引,性能极高
89
-
SELECT id FROM t_order LIMIT1000000, 10
90
-
) t2 ONt1.id=t2.id;
96
+
SELECT id FROM t_order ORDER BY id LIMIT1000000, 10
97
+
) t2 ONt1.id=t2.id
98
+
ORDER BYt1.id;
91
99
```
92
100
93
101
**工作原理**:
94
102
95
-
1. 子查询 `(SELECT id FROM t_order where id > 1000000 LIMIT 10)`利用主键索引快速定位目标分页的 10 条记录的 ID。
103
+
1. 子查询 `(SELECT id FROM t_order ORDER BY id LIMIT 1000000, 10)`利用主键索引扫描并跳过前 1000000 条记录,返回目标分页的 10 条记录的 ID。
0 commit comments