File tree 1 file changed +5
-5
lines changed
1 file changed +5
-5
lines changed Original file line number Diff line number Diff line change @@ -64,12 +64,12 @@ SELECT * FROM t_order WHERE id > 100000 LIMIT 10
64
64
65
65
``` sql
66
66
# 通过子查询来获取 id 的起始值,把 limit 1000000 的条件转移到子查询
67
- SELECT * FROM t_order WHERE id >= (SELECT id FROM t_order limit 1000000 , 1 ) LIMIT 10 ;
67
+ SELECT * FROM t_order WHERE id >= (SELECT id FROM t_order where id > 1000000 limit 1 ) LIMIT 10 ;
68
68
```
69
69
70
70
** 工作原理** :
71
71
72
- 1 . 子查询 ` (SELECT id FROM t_order LIMIT 1000000, 1) ` 会利用主键索引快速定位到第 1000001 条记录,并返回其 ID 值。
72
+ 1 . 子查询 ` (SELECT id FROM t_order where id > 1000000 limit 1) ` 会利用主键索引快速定位到第 1000001 条记录,并返回其 ID 值。
73
73
2 . 主查询 ` SELECT * FROM t_order WHERE id >= ... LIMIT 10 ` 将子查询返回的起始 ID 作为过滤条件,使用 ` id >= ` 获取从该 ID 开始的后续 10 条记录。
74
74
75
75
不过,子查询的结果会产生一张新表,会影响性能,应该尽量避免大量使用子查询。并且,这种方法只适用于 ID 是正序的。在复杂分页场景,往往需要通过过滤条件,筛选到符合条件的 ID,此时的 ID 是离散且不连续的。
@@ -84,20 +84,20 @@ SELECT * FROM t_order WHERE id >= (SELECT id FROM t_order limit 1000000, 1) LIMI
84
84
-- 使用 INNER JOIN 进行延迟关联
85
85
SELECT t1.*
86
86
FROM t_order t1
87
- INNER JOIN (SELECT id FROM t_order LIMIT 1000000 , 10 ) t2 ON t1 .id = t2 .id ;
87
+ INNER JOIN (SELECT id FROM t_order where id > 1000000 LIMIT 10 ) t2 ON t1 .id = t2 .id ;
88
88
```
89
89
90
90
** 工作原理** :
91
91
92
- 1 . 子查询 ` (SELECT id FROM t_order LIMIT 1000000, 10) ` 利用主键索引快速定位目标分页的 10 条记录的 ID。
92
+ 1 . 子查询 ` (SELECT id FROM t_order where id > 1000000 LIMIT 10) ` 利用主键索引快速定位目标分页的 10 条记录的 ID。
93
93
2 . 通过 ` INNER JOIN ` 将子查询结果与主表 ` t_order ` 关联,获取完整的记录数据。
94
94
95
95
除了使用 INNER JOIN 之外,还可以使用逗号连接子查询。
96
96
97
97
``` sql
98
98
-- 使用逗号进行延迟关联
99
99
SELECT t1.* FROM t_order t1,
100
- (SELECT id FROM t_order limit 1000000 , 10 ) t2
100
+ (SELECT id FROM t_order where id > 1000000 LIMIT 10 ) t2
101
101
WHERE t1 .id = t2 .id ;
102
102
```
103
103
You can’t perform that action at this time.
0 commit comments