@@ -477,6 +477,45 @@ EXPLAIN SELECT /*+ NO_ORDER_INDEX(t, a) */ a FROM t ORDER BY a LIMIT 10;
477
477
478
478
和 ` ORDER_INDEX ` Hint 的示例相同,优化器对该查询会生成两类计划:` Limit + IndexScan(keep order: true) ` 和 ` TopN + IndexScan(keep order: false) ` ,当使用了 ` NO_ORDER_INDEX ` Hint,优化器会选择后一种不按照顺序读取索引的计划。
479
479
480
+ ### INDEX_LOOKUP_PUSHDOWN(t1_name, idx1_name [ , idx2_name ...] )
481
+
482
+ ` INDEX_LOOKUP_PUSHDOWN(t1_name, idx1_name [, idx2_name ...]) ` 提示优化器对指定表仅使用给出的索引,并下推 ` IndexLookUp ` 算子到 TiKV。
483
+
484
+ 以下示例展示了使用此 Hint 的查询计划:
485
+
486
+ {{< copyable "sql" >}}
487
+
488
+ ``` sql
489
+ CREATE TABLE t1 (a INT , b INT , key(a));
490
+ EXPLAIN SELECT /* + INDEX_LOOKUP_PUSHDOWN(t1, a) */ a, b FROM t1;
491
+ ```
492
+
493
+ ``` sql
494
+ + -- ---------------------------+----------+-----------+----------------------+--------------------------------+
495
+ | id | estRows | task | access object | operator info |
496
+ + -- ---------------------------+----------+-----------+----------------------+--------------------------------+
497
+ | IndexLookUp_7 | 10000 .00 | root | | |
498
+ | ├─LocalIndexLookUp(Build) | 10000 .00 | cop[tikv] | | index handle offsets:[1 ] |
499
+ | │ ├─IndexFullScan_5(Build) | 10000 .00 | cop[tikv] | table:t1, index:a(a) | keep order:false, stats:pseudo |
500
+ | │ └─TableRowIDScan_8(Probe) | 10000 .00 | cop[tikv] | table:t1 | keep order:false, stats:pseudo |
501
+ | └─TableRowIDScan_6(Probe) | 0 .00 | cop[tikv] | table:t1 | keep order:false, stats:pseudo |
502
+ + -- ---------------------------+----------+-----------+----------------------+--------------------------------+
503
+ ```
504
+
505
+ 在启用 ` INDEX_LOOKUP_PUSHDOWN ` hint 后,下推计划中的最外层 Build 算子会变为 ` IndexLookUp ` 。这意味着 TiKV 在扫描索引的同时,会尝试在本地回表查询对应的行数据。然而,由于索引和行数据可能分布在不同的 Region,下推请求无法保证覆盖所有目标行。因此,TiDB 端仍需保留 ` TableRowIDScan ` ,用于补充查询那些下推无法命中的行。此 hint 受系统变量 [ ` tidb_enable_index_lookup_pushdown ` ] ( /system-variables.md#tidb_enable_index_lookup_pushdown-从-v90-版本开始引入 ) 影响。
506
+
507
+ ` INDEX_LOOKUP_PUSHDOWN ` 当前的使用限制如下:
508
+
509
+ - 不支持缓存表(cache table)和临时表。
510
+ - 暂不支持分区表查询。
511
+ - 暂不支持复合主键或主键为非整型的聚簇索引表。
512
+ - 暂不支持除 ` REPEATABLE-READ ` 之外的其他隔离级别。
513
+ - 暂不支持[ 多值索引] ( /choose-index.md#使用多值索引 ) 的查询。
514
+ - 暂不支持 [ Follower Read] ( /follower-read.md ) 。
515
+ - 暂不支持 [ Stale Read] ( /stale-read.md ) 或 [ 使用 ` tidb_snapshot ` 来读取历史数据] ( /read-historical-data.md ) 。
516
+ - 下推的 ` IndexLookUp ` 算子暂不支持 keep order。若执行计划中包含基于索引列的 ` ORDER BY ` ,则会退化为普通的 ` IndexLookUp ` 查询。
517
+ - 下推的 ` IndexLookUp ` 算子暂不支持以分页 (paging)方式发送 Coprocessor 请求。
518
+
480
519
### AGG_TO_COP()
481
520
482
521
` AGG_TO_COP() ` 提示优化器将指定查询块中的聚合函数下推到 coprocessor。如果优化器没有下推某些适合下推的聚合函数,建议尝试使用。例如:
0 commit comments