PolarDB MySQL版的列存索引(IMCI)功能旨在显著加速您的分析型(AP)查询。为确保您的SQL查询能被列存索引正确加速并返回预期结果,请在使用该功能前详细了解其支持的范围和限制条件。
通用限制
在使用列存索引前,请确保您的集群环境和表结构满足以下基本要求:
存储引擎:仅支持为
InnoDB存储引擎的表创建列存索引。临时表:不支持对临时表(Temporary Table)使用列存索引进行查询加速。
虚拟列:支持对虚拟列(Virtual Column)创建列存索引,但需同时满足以下条件:
修改集群参数
imci_enable_virtual_column为ON。说明当前参数为SESSION级别,暂不支持在控制台上进行设置修改。
创建列存索引时未指定
order_key。
虚拟列类型:不支持为地理信息(Spatial)类型的虚拟列创建列存索引。
多主集群(Limitless):需要先修改集群参数
loose_polar_enable_imci_with_mm为ON后,才可添加全局列存索引只读节点并使用列存索引功能。
SELECT语句限制
列存索引仅用于加速SELECT查询。如果查询语句中包含以下任何一种结构,整个查询将无法使用列存索引进行加速,并退化为行存执行:
包含加锁读的
SELECT语句,例如,SELECT ... FOR UPDATE或SELECT ... 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)出现在
JOIN的ON条件中的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语句中包含了任何不被支持的表达式或函数,整个查询将退化为行存执行。
比较类表达式
表达式 | 是否支持列存索引 | 说明 |
| 当 | |
| 当 | |
| 当入参分别包含 | |
| 当 | |
| 当入参分别包含 | |
| - |
字符串类表达式
表达式 | 是否支持列存索引 | 说明 |
| - | |
| - | |
| - | |
| 使用列存索引功能时,只支持传入一个参数,不支持传入两个参数。 |
聚合函数类表达式
表达式 | 是否支持列存索引 |
|
加密与压缩类表达式
表达式 | 是否支持列存索引 |
| |
| |
| |
| |
| |
| |
| |
| |
|
JSON函数
函数 | 是否支持列存索引 |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
|
Spatial函数
函数 | 是否支持列存索引 |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
|