全部产品
Search
文档中心

云原生数据库 PolarDB:列存索引等值索引

更新时间:Mar 17, 2026

当字符串列的等值查询需要读取和比较全量数据时,列存索引(IMCI)提供等值索引功能,通过whole分词器将字符串构建为倒排索引,避免全表扫描,提升=IN表达式的查询效率。

说明

列存索引等值索引目前处于灰度阶段,若您有相关需求,请提交工单联系我们为您处理。

创建等值索引

等值索引通过whole分词器将整个字符串作为词项添加到倒排索引,查询时直接通过索引判断是否命中,避免读取与比较全量字符串。等值索引仅支持字符串类型的列。

创建等值索引的本质是创建倒排索引,用法与全文索引一致。更多信息,请参见IMCI全文索引使用说明

创建语法

CREATE TABLE table_name (
    column_name VARCHAR(32) COMMENT "imci_fts(type=5)"
) COMMENT 'columnar=1';

参数type=5表示使用whole分词器,将字符串整体作为一个词项构建索引。

配置等值查询加速

创建等值索引后,通过设置对应参数开启加速功能。开启后,等值查询将利用FtsTableScan算子或改写为MATCH表达式来加速。

加速 = 表达式

参数名

级别

说明

imci_convert_equal_to_match

Global/Session

控制是否开启=表达式使用等值索引加速功能。

  • ON:开启。

  • OFF(默认):关闭。

开启后,当查询条件仅包含等值比较时,IMCI使用FtsTableScan算子直接利用倒排索引加速查询:

mysql> EXPLAIN SELECT id, title FROM t1 WHERE title = 'Title0';
+----+----------------------+------+---------------------------------------------------------------+
| ID | Operator             | Name | Extra Info                                                    |
+----+----------------------+------+---------------------------------------------------------------+
|  1 | Select Statement     |      | IMCI Execution Plan (max_dop = 1, max_query_mem = 1073741824) |
|  2 | └─Compute Scalar     |      |                                                               |
|  3 |   └─FtsTableScan     | t1   | Term: ("title0") Fallback: (t1.title = "Title0")              |
+----+----------------------+------+---------------------------------------------------------------+

当等值比较与其他条件组合使用时(如OR),IMCI会将等值条件改写为MATCH表达式:

mysql> EXPLAIN SELECT id, title FROM t1 WHERE title = 'Title0' OR id = 1;
+----+----------------------+------+--------------------------------------------------------------------------------------+
| ID | Operator             | Name | Extra Info                                                                           |
+----+----------------------+------+--------------------------------------------------------------------------------------+
|  1 | Select Statement     |      | IMCI Execution Plan (max_dop = 1, max_query_mem = 1073741824)                        |
|  2 | └─Compute Scalar     |      |                                                                                      |
|  3 |   └─Table Scan       | t1   | Cond: ((id = 1) OR (MATCH(title) AGAINST ("title0") , Fallback: (title = "Title0"))) |
+----+----------------------+------+--------------------------------------------------------------------------------------+

加速 IN 表达式

参数名

级别

说明

imci_convert_in_to_match

Global/Session

控制是否开启IN表达式使用等值索引加速功能。

  • ON:开启。

  • OFF(默认):关闭。

开启后,当查询条件仅包含IN表达式时,IMCI使用FtsTableScan算子直接利用倒排索引加速查询:

mysql> EXPLAIN SELECT id, title FROM t1 WHERE title IN ('Title0', 'Title10', 'Title100');
+----+----------------------+------+---------------------------------------------------------------------------------------------------+
| ID | Operator             | Name | Extra Info                                                                                        |
+----+----------------------+------+---------------------------------------------------------------------------------------------------+
|  1 | Select Statement     |      | IMCI Execution Plan (max_dop = 1, max_query_mem = 1073741824)                                     |
|  2 | └─Compute Scalar     |      |                                                                                                   |
|  3 |   └─FtsTableScan     | t1   | Term: ("title0", "title10", "title100") Fallback: (t1.title IN ("Title0", "Title10", "Title100")) |
+----+----------------------+------+---------------------------------------------------------------------------------------------------+

IN表达式与其他条件组合使用时(如OR),IMCI会将IN条件改写为MATCH表达式:

mysql> EXPLAIN SELECT id, title FROM t1 WHERE title IN ('Title0', 'Title10', 'Title100') OR id = 1;
+----+----------------------+------+---------------------------------------------------------------------------------------------------------------------------------------+
| ID | Operator             | Name | Extra Info                                                                                                                            |
+----+----------------------+------+---------------------------------------------------------------------------------------------------------------------------------------+
|  1 | Select Statement     |      | IMCI Execution Plan (max_dop = 1, max_query_mem = 1073741824)                                                                         |
|  2 | └─Compute Scalar     |      |                                                                                                                                       |
|  3 |   └─Table Scan       | t1   | Cond: ((id = 1) OR (MATCH(title) AGAINST ("title0", "title10", "title100") , Fallback: (title IN ("Title0", "Title10", "Title100")))) |
+----+----------------------+------+---------------------------------------------------------------------------------------------------------------------------------------+

同时开启两个参数后,=IN表达式可以在同一查询中同时加速:

mysql> EXPLAIN SELECT id, title, message FROM t1 WHERE title = 'Title10' AND message IN ('Message10', 'Message11');
+----+----------------------+------+--------------------------------------------------------------------------------------------------------------------------------------+
| ID | Operator             | Name | Extra Info                                                                                                                           |
+----+----------------------+------+--------------------------------------------------------------------------------------------------------------------------------------+
|  1 | Select Statement     |      | IMCI Execution Plan (max_dop = 1, max_query_mem = 1073741824)                                                                        |
|  2 | └─Compute Scalar     |      |                                                                                                                                      |
|  3 |   └─FtsTableScan     | t1   | Term: ("title10") Term: ("message10", "message11") Fallback: ((t1.title = "Title10") AND (t1.message IN ("Message10", "Message11"))) |
+----+----------------------+------+--------------------------------------------------------------------------------------------------------------------------------------+