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語句中包含了任何不被支援的運算式或函數,整個查詢將退化為行存執行。
比較類運算式
運算式 | 是否支援列存索引 | 說明 |
| 當 | |
| 當 | |
| 當入參分別包含 | |
| 當 | |
| 當入參分別包含 | |
| - |
字串類運算式
運算式 | 是否支援列存索引 | 說明 |
| - | |
| 支援 BOOLEAN MODE 與 NATURAL LANGUAGE MODE; | |
| - | |
| 使用列存索引功能時,只支援傳入一個參數,不支援傳入兩個參數。 |
加密與壓縮類運算式
運算式 | 是否支援列存索引 |
| |
| |
| |
| |
| |
| |
| |
| |
|
JSON函數
函數 | 是否支援列存索引 |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
|
Spatial函數
函數 | 是否支援列存索引 |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
|