承接上文關於 TRUNCATE PARTITION 與 TO_SECONDS 的介紹,本文將通過一個「員工信息表」的進階實例,深度演示 MySQL 5.5 引入的 RANGE COLUMNS 多列分區 語法,並結合 EXPLAIN PARTITIONS 實測,揭示分區裁剪在複合分區鍵下的觸發規則與性能表現。
假設我們需要按「性別」與「入職日期」雙維度劃分員工數據,MySQL 5.5 的 PARTITION BY RANGE COLUMNS(gender, hire_date) 完美契合此類需求:
CREATE TABLE employees (
emp_no INT(11) NOT NULL,
birth_date DATE NOT NULL,
first_name VARCHAR(14) NOT NULL,
last_name VARCHAR(16) NOT NULL,
gender CHAR(1) DEFAULT NULL,
hire_date DATE NOT NULL
) ENGINE=MyISAM
PARTITION BY RANGE COLUMNS(gender, hire_date) (
PARTITION p01 VALUES LESS THAN ('F', '1990-01-01'),
PARTITION p02 VALUES LESS THAN ('F', '2000-01-01'),
PARTITION p03 VALUES LESS THAN ('F', MAXVALUE),
PARTITION p04 VALUES LESS THAN ('M', '1990-01-01'),
PARTITION p05 VALUES LESS THAN ('M', '2000-01-01'),
PARTITION p06 VALUES LESS THAN ('M', MAXVALUE),
PARTITION p07 VALUES LESS THAN (MAXVALUE, MAXVALUE)
);
分區邏輯清晰直觀:
p01-p03:女性員工,按入職年份三段式劃分p04-p06:男性員工,同樣三段式劃分p07:兜底分區,捕獲異常數據最直觀的方式是用與分區定義完全一致的條件查詢:
SELECT
CASE
WHEN gender='F' AND hire_date<'1990-01-01' THEN 'p1'
WHEN gender='F' AND hire_date<'2000-01-01' THEN 'p2'
WHEN gender='F' THEN 'p3'
WHEN gender='M' AND hire_date<'1990-01-01' THEN 'p4'
WHEN gender='M' AND hire_date<'2000-01-01' THEN 'p5'
WHEN gender='M' THEN 'p6'
ELSE 'p7'
END AS p,
COUNT(*) AS rows
FROM employees
GROUP BY p;
對於 MyISAM/Archive 引擎,table_rows 統計準確;InnoDB 僅為估算值:
SELECT
partition_name AS part,
partition_expression AS expr,
partition_description AS descr,
table_rows
FROM INFORMATION_SCHEMA.partitions
WHERE TABLE_SCHEMA = SCHEMA() AND TABLE_NAME = 'employees';
輸出結果與手工統計完全一致,驗證了分區定義的正確性。
MySQL 5.5 最大亮點在於:凡使用 COLUMNS 關鍵字定義的分區,均支援分區裁剪,不再受限於 5.1 時代的 TO_DAYS/YEAR 兩個函數。實測如下:
EXPLAIN PARTITIONS
SELECT COUNT(*) FROM employees
WHERE gender='F' AND hire_date<'1990-01-01';
-- partitions: p01 (僅掃描 p01,type=ALL 因無索引,但已裁剪其餘 6 個分區)
EXPLAIN PARTITIONS
SELECT COUNT(*) FROM employees WHERE gender='F';
-- partitions: p01,p02,p03,p07 (僅掃描女性相關 4 個分區,p07 為兜底)
EXPLAIN PARTITIONS
SELECT COUNT(*) FROM employees WHERE hire_date<'1990-01-01';
-- partitions: p01,p02,p03,p04,p05,p06,p07 (全部 7 個分區,裁剪完全失效)
分區裁剪的觸發規則與複合索引的「最左前綴原則」完全一致:
gender)才能觸發裁剪;hire_date),將導致全分區掃描;gender='F')可部分裁剪。設計建議:
EXPLAIN PARTITIONS 常態化巡檢裁剪效果。MySQL 5.5 的 RANGE COLUMNS 多列分區配合原生分區裁剪,為多維度數據劃分提供了強大而直觀的解決方案。掌握「最左前綴」裁剪規則,是發揮分區性能的關鍵。在實際架構中,建議將業務最核心的篩選維度(如租戶 ID、業務類型、性別等)作為分區鍵首列,確保高頻查詢均能享受分區裁剪紅利。