1. 程式人生 > 其它 >MySQL分割槽表的一些問題

MySQL分割槽表的一些問題

技術標籤: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 //檢視所有資料

個人覺得,分割槽表不如直接分表來的乾脆