MySQL分割槽表的一些問題
阿新 • • 發佈:2020-12-14
技術標籤:MySQL&Mybatis
分割槽表的特點
MySQL支援多種分割槽表。我們看到最多的是根據範圍進行分割槽,每個分割槽儲存落在某個範圍的記錄,分割槽表示式可以是列,也可以是包含列的表示式。
分割槽表建表
1. 分割槽表不能使用非分割槽的其他單獨的列做主鍵
2. 分割槽表新建時要定義好每一個分割槽的詳細資訊
3. 分割槽表可以建立聯合主鍵,也可以不用主鍵,指定兩個列建立唯一索引(如果不建主鍵,在一個列上建唯一索引也是不會成功的)
4. 分割槽表建立主鍵後,如果分割槽發生改變,比如新建或刪除了分割槽,插入語句不會受影響
5. 因為是聯合主鍵,如果需要單一欄位ID 唯一,這時想單獨給ID 設定 唯一索引是不會成功的,可以自行生成資料插入(比如uuid) 。
下面是幾種錯誤建表報錯示例:
CREATE TABLE sales ( dt datetime not null, person_id varchar(64) not null )ENGINE=InnoDB DEFAULT CHARSET=utf8 PARTITION by RANGE (YEAR(dt)) [SQL] CREATE TABLE sales ( dt datetime not null, person_id varchar(64) not null )ENGINE=InnoDB DEFAULT CHARSET=utf8 PARTITION by RANGE (YEAR(dt)) [Err] 1492 - For RANGE partitions each partition must be defined
CREATE TABLE sales ( `id` int(20) NOT NULL AUTO_INCREMENT COMMENT '主鍵', dt datetime not null, person_id varchar(64) not null, PRIMARY KEY (`id`) )ENGINE=InnoDB DEFAULT CHARSET=utf8 PARTITION by RANGE (YEAR(dt)) ( partition p_2019 VALUES LESS THAN (2019), PARTITION p_2020 VALUES LESS THAN (2020)); ) [SQL] CREATE TABLE sales ( `id` int(20) NOT NULL AUTO_INCREMENT COMMENT '主鍵', dt datetime not null, person_id varchar(64) not null, PRIMARY KEY (`id`) )ENGINE=InnoDB DEFAULT CHARSET=utf8 PARTITION by RANGE (YEAR(dt)) ( partition p_2019 VALUES LESS THAN (2019), PARTITION p_2020 VALUES LESS THAN (2020)); [Err] 1503 - A PRIMARY KEY must include all columns in the table's partitioning function
正確的建表語句
CREATE TABLE sales (
`id` int(20) NOT NULL AUTO_INCREMENT COMMENT '主鍵',
dt datetime not null,
person_id varchar(64) not null,
PRIMARY KEY (`id`,dt)
)ENGINE=InnoDB DEFAULT CHARSET=utf8 PARTITION by RANGE (YEAR(dt))
( partition p_2019 VALUES LESS THAN (2019), //注:值小於2019的存到p_2019分割槽,也就是存的資料是2018年或之前的
PARTITION p_2020 VALUES LESS THAN (2020),
PARTITION p_2021 VALUES LESS THAN (2021)
);
增加分割槽
ALTER TABLE sales ADD PARTITION (PARTITION p_2022 VALUES LESS THAN (2022)); //按範圍分分割槽
ALTER TABLE sales ADD PARTITION (partition p6 values in ('Technique Leader') ); //也可以指定按具體值分分割槽
刪除分割槽
ALTER TABLE sales DROP PARTITION p_2019
檢視各個分割槽的資料
select * from sales PARTITION(p_2019);
select * from sales //檢視所有資料
個人覺得,分割槽表不如直接分表來的乾脆