当字符串列的等值查询需要读取和比较全量数据时,列存索引(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表达式来加速。
加速 = 表达式
参数名 | 级别 | 说明 |
| Global/Session | 控制是否开启
|
开启后,当查询条件仅包含等值比较时,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 表达式
参数名 | 级别 | 说明 |
| Global/Session | 控制是否开启
|
开启后,当查询条件仅包含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"))) |
+----+----------------------+------+--------------------------------------------------------------------------------------------------------------------------------------+