介紹
COLUMN分區是5.5開始引入的分區功能,只有RANGE COLUMN和LIST COLUMN這兩種分區;支持整形、日期、字符串;RANGE和LIST的分區方式非常的相似。
COLUMNS和RANGE和LIST分區的區別
1.針對日期字段的分區就不需要再使用函數進行轉換了,例如針對date字段進行分區不需要再使用YEAR()表達式進行轉換。
2.COLUMN分區支持多個字段作為分區鍵但是不支持表達式作為分區鍵。
COLUMNS支持的類型
整形支持:tinyint,smallint,mediumint,int,bigint;不支持decimal和float
時間類型支持:date,datetime
字符類型支持:char,varchar,binary,varbinary;不支持text,blob
一、RANGE COLUMNS分區
1.日期字段分區
| CREATE TABLE members (id INT,joined DATE NOT NULL)PARTITION BY RANGE COLUMNS(joined) (PARTITION a VALUES LESS THAN ('1960-01-01'),PARTITION b VALUES LESS THAN ('1970-01-01'),PARTITION c VALUES LESS THAN ('1980-01-01'),PARTITION d VALUES LESS THAN ('1990-01-01'),PARTITION e VALUES LESS THAN MAXVALUE); |
1.插入測試數據
| insert into members(id,joined) values(1,'1950-01-01'),(1,'1960-01-01'),(1,'1980-01-01'),(1,'1990-01-01'); |
2.查詢分區數據分布
| SELECT PARTITION_NAME,PARTITION_METHOD,PARTITION_EXPRESSION,PARTITION_DESCRIPTION,TABLE_ROWS,SUBPARTITION_NAME,SUBPARTITION_METHOD,SUBPARTITION_EXPRESSION FROM information_schema.PARTITIONS WHERE TABLE_SCHEMA=SCHEMA() AND TABLE_NAME='members'; |
當前有5個分區只插入了4條記錄,其中C分區是沒有記錄的,結果和實際一樣。

3.分析執行計劃
| explain select id,joined from tb_partition.members where joined=YEAR(now());explain select id,joined from tb_partition.members where joined='1963-01-01'; |

第一條查詢使用了函數導致查詢沒有走具體的分區而是掃描的所有的分區,而第二條查詢執行語句查找具體的分區。
2.多個字段組合分區
| CREATE TABLE rcx (a INT,b INT)PARTITION BY RANGE COLUMNS(a,b) (PARTITION p0 VALUES LESS THAN (5,10),PARTITION p1 VALUES LESS THAN (10,20),PARTITION p2 VALUES LESS THAN (15,30),PARTITION p3 VALUES LESS THAN (MAXVALUE,MAXVALUE)); |
注意:多字段的分區鍵比較是基于數組的比較。它先用插入的數據的第一個字段值和分區的第一個值進行比較,如果插入的第一個值小于分區的第一個值那么就不需要比較第二個值就屬于該分區;如果第一個值等于分區的第一個值,開始比較第二個值同樣如果第二個值小于分區的第二個值那么就屬于該分區。
新聞熱點
疑難解答