File tree Expand file tree Collapse file tree 1 file changed +5
-5
lines changed
Expand file tree Collapse file tree 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
6464
6565``` sql
6666# 通过子查询来获取 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 ;
6868```
6969
7070** 工作原理** :
7171
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 值。
73732 . 主查询 ` SELECT * FROM t_order WHERE id >= ... LIMIT 10 ` 将子查询返回的起始 ID 作为过滤条件,使用 ` id >= ` 获取从该 ID 开始的后续 10 条记录。
7474
7575不过,子查询的结果会产生一张新表,会影响性能,应该尽量避免大量使用子查询。并且,这种方法只适用于 ID 是正序的。在复杂分页场景,往往需要通过过滤条件,筛选到符合条件的 ID,此时的 ID 是离散且不连续的。
@@ -84,20 +84,20 @@ SELECT * FROM t_order WHERE id >= (SELECT id FROM t_order limit 1000000, 1) LIMI
8484-- 使用 INNER JOIN 进行延迟关联
8585SELECT t1.*
8686FROM 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 ;
8888```
8989
9090** 工作原理** :
9191
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。
93932 . 通过 ` INNER JOIN ` 将子查询结果与主表 ` t_order ` 关联,获取完整的记录数据。
9494
9595除了使用 INNER JOIN 之外,还可以使用逗号连接子查询。
9696
9797``` sql
9898-- 使用逗号进行延迟关联
9999SELECT 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
101101WHERE t1 .id = t2 .id ;
102102```
103103
You can’t perform that action at this time.
0 commit comments