全部產品
Search
文件中心

PolarDB:列存索引JSON索引

更新時間:Mar 18, 2026

當JSON列的查詢需要解析整個JSON資料時,列存索引(IMCI)提供JSON索引功能,通過JSON分詞器將JSON資料拆解並構建為倒排索引,避免載入和解析完整JSON對象,提升json_overlapsjson_containsjson_extract等運算式的查詢效率。

說明

列存索引JSON索引目前處於灰階階段,若您有相關需求,請提交工單聯絡我們為您處理。

建立JSON索引

JSON索引通過JSON分詞器將JSON對象拆解出數組項或索引值對並添加到倒排索引,查詢時直接通過索引判斷是否命中,避免載入和解析整個JSON對象。JSON索引僅支援JSON類型的列,包含兩種索引類型:

  • JSON數組索引:用於數群組類型的JSON列,僅支援標量數組(即數組元素為整型、字串或時間等),不適用於對象數組或嵌套數組。

  • JSON索引值索引:用於物件類型的JSON列,且索引值對的實值型別為標量(即整型、字串或時間等)。通過json_paths參數指定需要索引的鍵。

建立JSON索引的本質是建立倒排索引,用法與全文索引一致。更多資訊,請參見IMCI全文索引使用說明

操作步驟

  1. 開啟JSON索引功能:使用JSON索引前,需要先開啟全域參數imci_enable_fts_json

    參數名

    層級

    說明

    imci_enable_fts_json

    Global

    控制是否開啟JSON索引功能。

    • ON(預設):開啟。

    • OFF:關閉。

  2. 建立文法

    CREATE TABLE table_name (
        column_name JSON COMMENT "imci_fts(type=4 mode=MODE json_paths={$.PATH1,$.PATH2,...})"
    ) COMMENT 'columnar=1';

    參數說明:

    • type=4:表示使用JSON分詞器。

    • mode:指定JSON索引類型。1為JSON數組索引,2為JSON索引值索引。

    • json_paths:指定JSON索引值索引的鍵資訊,僅在mode=2時使用。例如,對於'{"k1":"v1","k2":2}',可以指定json_paths={$.k1}json_paths={$.k2}json_paths={$.k1,$.k2}

JSON數組索引

JSON數組索引用於加速數群組類型JSON列的查詢,支援json_overlapsjson_contains運算式。

建立文法

ALTER TABLE table_name MODIFY COLUMN column_name JSON DEFAULT NULL COMMENT 'imci_fts(type=4 mode=1)';

加速json_overlaps查詢

參數名

層級

說明

imci_convert_json_overlap_to_match

Global/Session

控制是否開啟json_overlaps使用JSON索引加速功能。

  • ON:開啟。

  • OFF(預設):關閉。

開啟後,json_overlaps運算式利用FtsTableScan加速。JSON分詞器將目標值分解後分別在倒排索引中查詢,最後求其並集(任意元素匹配即命中)。

mysql> EXPLAIN SELECT * FROM t1 WHERE json_overlaps(title, '[300, "301"]');
+----+----------------------+------+-----------------------------------------------------------------------------------------------------------------+
| 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: ("300(json_type(2))", "301(json_type(5))") Fallback: (JSON_OVERLAPS(t1.title, "[300, "301"](json)") <> 0) |
+----+----------------------+------+-----------------------------------------------------------------------------------------------------------------+

加速json_contains查詢

參數名

層級

說明

imci_convert_json_contains_to_match

Global/Session

控制是否開啟json_contains使用JSON索引加速功能。

  • ON:開啟。

  • OFF(預設):關閉。

開啟後,json_contains運算式利用FtsTableScan加速。JSON分詞器將目標值分解後分別在倒排索引中查詢,最後求其交集(所有元素都匹配才命中)。

mysql> EXPLAIN SELECT * FROM t1 WHERE json_contains(title, '[300, "301"]');
+----+----------------------+------+-----------------------------------------------------------------------------------------------------------+
| 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: ("300(json_type(2))", "301(json_type(5))") Fallback: (JSON_CONTAINS(t1.title, "[300, "301"]") <> 0) |
+----+----------------------+------+-----------------------------------------------------------------------------------------------------------+

JSON索引值索引

JSON索引值索引用於加速物件類型JSON列中特定鍵的等值查詢,支援json_extract運算式。索引建立時通過json_paths指定需要索引的鍵,查詢時根據索引值對的值在倒排索引中快速定位匹配行。

建立文法

ALTER TABLE table_name MODIFY COLUMN column_name JSON DEFAULT NULL COMMENT 'imci_fts(type=4 mode=2 json_paths={$.k1,$.k2})';

加速json_extract查詢

參數名

層級

說明

imci_convert_json_exepact_to_match

Global/Session

控制是否開啟json_extract使用JSON索引加速功能。

  • ON:開啟。

  • OFF(預設):關閉。

開啟後,json_extract等值運算式利用FtsTableScan加速。以下樣本查詢$.k1值等於'1'的行:

mysql> EXPLAIN SELECT * FROM t1 WHERE json_extract(title, "$.k1") = '1';
+----+----------------------+------+------------------------------------------------------------------------------------------------+
| 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: ("1(json_index(0),json_type(5))") Fallback: (JSON_EXTRACT(t1.title, "$.k1") = "1(json)") |
+----+----------------------+------+------------------------------------------------------------------------------------------------+

多個索引值條件可以在同一查詢中同時加速:

mysql> EXPLAIN SELECT * FROM t1 WHERE json_extract(title, "$.k1") = '1' AND json_extract(title, "$.k2") = 2;
+----+----------------------+------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| 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: ("1(json_index(0),json_type(5))") Term: ("2(json_index(1),json_type(2))") Fallback: ((JSON_EXTRACT(t1.title, "$.k1") = "1(json)") AND (JSON_EXTRACT(t1.title, "$.k2") = "2(json)")) |
+----+----------------------+------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+