使用限制

PolarDB MySQL的列存索引(IMCI)功能旨在显著加速您的分析型(AP)查询。为确保您的SQL查询能被列存索引正确加速并返回预期结果,请在使用该功能前详细了解其支持的范围和限制条件。

通用限制

在使用列存索引前,请确保您的集群环境和表结构满足以下基本要求:

  • 存储引擎:仅支持为InnoDB存储引擎的表创建列存索引。

  • 临时表:不支持对临时表(Temporary Table)使用列存索引进行查询加速。

  • 虚拟列:支持对虚拟列(Virtual Column)创建列存索引,但需同时满足以下条件:

    • 修改集群参数imci_enable_virtual_columnON

      说明

      当前参数为SESSION级别,暂不支持在控制台上进行设置修改。

    • 创建列存索引时未指定order_key

  • 虚拟列类型:不支持为地理信息(Spatial)类型的虚拟列创建列存索引。

  • 多主集群(Limitless):需要先修改集群参数loose_polar_enable_imci_with_mmON后,才可添加全局列存索引只读节点并使用列存索引功能。

SELECT语句限制

列存索引仅用于加速SELECT查询。如果查询语句中包含以下任何一种结构,整个查询将无法使用列存索引进行加速,并退化为行存执行:

  • 包含加锁读的SELECT语句,例如,SELECT ... FOR UPDATESELECT ... FOR SHARE

  • 包含Frame定义的窗口函数(Window Function)的SELECT语句。例如,在OVER()子句中使用了ROWS UNBOUNDED PRECEDING

    SELECT
        time,
        subject,
        val,
        SUM(val) OVER (
            PARTITION BY subject
            ORDER BY time
            ROWS UNBOUNDED PRECEDING  --- window function 中的 frame 定义,IMCI 不支持
        ) AS running_total
    FROM
        observations;
  • 子查询出现在GROUP BY子句中的SELECT语句。例如,SELECT SUM(a) FROM t1 GROUP BY (SELECT ... FROM ...) as some_subquery;

  • 子查询出现在 ORDER BY的表达式中的SELECT语句。例如,SELECT a FROM t1 ORDER BY (SELECT ... FROM ...) as some_subquery;

  • 子查询的关联项(Correlated Subquery)出现在JOINON条件中的SELECT语句。例如,WHERE t1.a in (SELECT t2.a FROM t2 INNER JOIN t3 on t2.a = t3.a AND t2.b > t1.b);

  • 子查询中包含窗口函数,且其关联项出现在HAVING条件中的SELECT语句。

  • 子查询中包含UNION,且其关联项出现在UNION的某个子查询中的SELECT语句。

表达式与函数限制

如果SELECT语句中包含了任何不被支持的表达式或函数,整个查询将退化为行存执行。

比较类表达式

表达式

是否支持列存索引

说明

BETWEEN ... AND ...

支持

a BETWEEN b AND cbc的数据类型不同时,会存在兼容性问题,可能会导致查询结果与不使用列存索引的查询结果不一致的问题。

NOT BETWEEN ... AND ...

支持

a NOT BETWEEN b AND cbc的数据类型不同时,会存在兼容性问题,可能会导致查询结果与不使用列存索引的查询结果不一致的问题。

GREATEST()

支持

当入参分别包含TIME类型和字符串类型时,比较结果可能会与不使用列存索引的结果存在差异。

IN()

支持

IN(expr0, expr1, ...)中的expr0,expr1,...数据类型不同时,会存在兼容性问题,可能会导致查询结果与不使用列存索引的查询结果不一致的问题。

LEAST()

支持

当入参分别包含TIME类型和字符串类型时,比较结果可能会与不使用列存索引的结果存在差异。

SOUNDS LIKE

不支持

-

字符串类表达式

表达式

是否支持列存索引

说明

SOUNDEX()

不支持

-

MATCH

不支持

-

LOAD_FILE()

不支持

-

TIMESTAMP()

支持

使用列存索引功能时,只支持传入一个参数,不支持传入两个参数。

聚合函数类表达式

表达式

是否支持列存索引

JSON_OBJECTAGG()

不支持

加密与压缩类表达式

表达式

是否支持列存索引

AES_DECRYPT()

不支持

AES_ENCRYPT()

不支持

COMPRESS()

不支持

RANDOM_BYTES()

不支持

STATEMENT_DIGEST()

不支持

STATEMENT_DIGEST_TEXT()

不支持

UNCOMPRESS()

不支持

UNCOMPRESSED_LENGTH()

不支持

VALIDATE_PASSWORD_STRENGTH()

不支持

JSON函数

函数

是否支持列存索引

JSON_ARRAY_APPEND()

不支持

JSON_ARRAY_INSERT()

不支持

JSON_CONTAINS_PATH()

不支持

JSON_INSERT()

不支持

JSON_MERGE()

不支持

JSON_MERGE_PATCH()

不支持

JSON_MERGE_PRESERVE()

不支持

JSON_REPLACE()

不支持

JSON_SCHEMA_VALID()

不支持

JSON_SCHEMA_VALIDATION_REPORT()

不支持

JSON_SEARCH()

不支持

JSON_SET()

不支持

JSON_STORAGE_FREE()

不支持

JSON_STORAGE_SIZE()

不支持

JSON_VALUE()

不支持

MEMBER OF()

不支持

Spatial函数

函数

是否支持列存索引

ST_AsGeoJSON()

不支持

ST_Buffer()

不支持

ST_Buffer_Strategy()

不支持

ST_Centroid()

不支持

ST_Collect()

不支持

ST_ConvexHull()

不支持

ST_EndPoint()

不支持

ST_ExteriorRing()

不支持

ST_FrechetDistance()

不支持

ST_GeoHash()

不支持

ST_GeometryN()

不支持

ST_GeometryType()

不支持

ST_GeomFromGeoJSON()

不支持

ST_HausdorffDistance()

不支持

ST_InteriorRingN()

不支持

ST_Intersection()

不支持

ST_IsClosed()

不支持

ST_IsEmpty()

不支持

ST_IsSimple()

不支持

ST_IsValid()

不支持

ST_LatFromGeoHash()

不支持

ST_LineInterpolatePoint()

不支持

ST_LineInterpolatePoints()

不支持

ST_LongFromGeoHash()

不支持

ST_NumGeometries()

不支持

ST_NumInteriorRing()

不支持

ST_NumInteriorRings()

不支持

ST_NumPoints()

不支持

ST_PointAtDistance()

不支持

ST_PointFromGeoHash()

不支持

ST_PointN()

不支持

ST_StartPoint()

不支持

ST_SwapXY()

不支持