本文為您介紹如何OnLine重建列存索引(Clustered Columnar Index,CCI)。
前提條件
需要存在已經建立的列存索引。
重建時需確保Online且無鎖的,不會影響列存相關的線上流量,不會影響行存業務。
注意事項
執行個體版本需為5.4.20-20250714及以上。
背景資訊
在使用列存索引(CCI)的過程中,可能會遇到需要調整CCI的排序鍵和分區鍵的多種情況。這些情況調整通常需通過重建索引來實現,以最佳化效能並適應業務變化。
以下是常見的需要修改列存索引設計的情境:
業務測試與效能最佳化:在初期進行業務測試時,基於當前的資料訪問模式建立了列存索引。然而,測試結果顯示索引的查詢效能未達到預期目標。此時,可能需要重新設計列存索引的排序鍵和分區鍵,以更好地匹配查詢模式和資料分布,從而提升效能。
業務需求變更與表結構調整:隨著業務的發展,資料庫表的結構發生了變化,包括新增或刪除欄位、修改欄位類型等。同時,相關的業務SQL查詢也發生了調整。這些變更可能導致現有的列存索引不再適配新的查詢需求,因此需要重新設計索引的排序鍵和分區鍵,以確保索引的高效性和適用性。
資料分布與增長模式變化:隨著資料量的持續增長,原有的分區策略和分區數量可能無法有效支撐新的資料規模。或者,列存索引的使用情境發生變化,需要根據時間列等特殊列進行分區。需要調整分區鍵或重新定義分區策略。
相容性與升級需求:在列存索引有重大更新時,現有的列存索引結構可能需要調整以相容新版本的特性。這種情況下,需要通過重建索引來應用新的設計方案。
文法
變數設定
重建CCI時,系統會先在表內建立一個新的CCI,再刪除舊的CCI,因此必須先設定該變數。
SET GLOBAL MAX_CCI_COUNT = 2;允許在一張表內最多建立兩個CCI,當表內已經存在多個CCI時,請將此值設定的更大。
重建文法
同步處理重建
通過ALTER TABLE REBUILD文法對指定的CCI進行重建,CCI的具體定義可參見建立和使用CCI。
ALTER TABLE tbl_name REBUILD ClUSTERED COLUMNAR INDEX index_name [CCI DEFINITION]; 指定的表和CCI必須存在,否則會報錯CCI不存在。
歸檔CCI不允許重建。
非同步處理重建
當資料量比較大時,由於重建的時間比較長,推薦通過非同步方式執行:
ALTER TABLE tbl_name REBUILD ClUSTERED COLUMNAR INDEX index_name [CCI DEFINITION] ASYNC=TRUE;樣本
# 建立一個帶有列存索引的表,排序鍵和分區鍵都是id
CREATE TABLE `t_order` (
`id` bigint(11) NOT NULL AUTO_INCREMENT,
`order_id` varchar(20) DEFAULT NULL,
`buyer_id` varchar(20) DEFAULT NULL,
`seller_id` varchar(20) DEFAULT NULL,
`order_snapshot` longtext,
CLUSTERED COLUMNAR INDEX `cci_test` (`id`) PARTITION BY KEY(`id`) PARTITIONS 4,
PRIMARY KEY (`id`)
) ENGINE = InnoDB DEFAULT CHARSET = utf8 AUTO_INCREMENT = 2
PARTITION BY KEY(`id`)
PARTITIONS 16;
# 更改排序鍵和分區數,重建列存索引
ALTER TABLE `t_order` REBUILD ClUSTERED COLUMNAR INDEX `cci_test`(`seller_id`) PARTITION BY KEY(`id`) PARTITIONS 16;
# 查看新的表結構
SHOW CREATE TABLE t_order\G
*************************** 1. row ***************************
Table: t_order
Create Table: CREATE TABLE `t_order` (
`id` bigint(11) NOT NULL AUTO_INCREMENT,
`order_id` varchar(20) DEFAULT NULL,
`buyer_id` varchar(20) DEFAULT NULL,
`seller_id` varchar(20) DEFAULT NULL,
`order_snapshot` longtext,
PRIMARY KEY (`id`),
CLUSTERED COLUMNAR INDEX `cci_test` (`seller_id`)
PARTITION BY KEY(`id`)
PARTITIONS 16
) ENGINE = InnoDB DEFAULT CHARSET = utf8
PARTITION BY KEY(`id`)
PARTITIONS 16