全部產品
Search
文件中心

:重建列存索引

更新時間:Aug 09, 2025

本文為您介紹如何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