表分區是將一大表,根據條件分割成若干個小表。mysql5.1開始支持數據表分區了。
如:某用戶表的記錄超過了800萬條,那麼就能夠根據入庫日期將表分區,也能夠根據所在地將表分區。固然也可根據其餘的條件分區。mysql
數據庫分區是一種物理數據庫設計技術。雖然分區技術能夠實現不少效果,但其主要目的是爲了在特定的SQL操做中減小數據讀寫的總量以縮減sql語句的響應時間,同時對於應用來講分區徹底是透明的。算法
爲了改善大型表以及具備各類訪問模式的表的可伸縮性,可管理性和提升數據庫效率。sql
· RANGE分區:基於屬於一個給定連續區間的列值,把多行分配給分區。
· LIST分區:相似於按RANGE分區,區別在於LIST分區是基於列值匹配一個離散值集合中的某個值來進行選擇。
· HASH分區:基於用戶定義的表達式的返回值來進行選擇的分區,該表達式使用將要插入到表中的這些行的列值進行計算。這個函數能夠包含MySQL 中有效的、產生非負整數值的任何表達式。
· KEY分區:相似於按HASH分區,區別在於KEY分區只支持計算一列或多列,且MySQL 服務器提供其自身的哈希函數。必須有一列或多列包含整數值。數據庫
以部門員工表爲例子:express
1) 建立range分區服務器
create table empless
(empno varchar(20) not null ,數據庫設計
empname varchar(20),函數
deptno int,優化
birthdate date,
salary int
)
partition by range(salary)
(
partition p1 values less than (1000),
partition p2 values less than (2000),
partition p3 values less than maxvalue
);
2) 建立list分區
create table emp
(empno varchar(20) not null ,
empname varchar(20),
deptno int,
birthdate date not null,
salary int
)
partition by list(deptno)
(
partition p1 values in (10),
partition p2 values in (20),
partition p3 values in (30)
);
以部門做爲分區依據,每一個部門作一分區。
3) 建立hash分區
HASH分區主要用來確保數據在預先肯定數目的分區中平均分佈。在RANGE和LIST分區中,必須明確指定一個給定的列值或列值集合應該保存在哪 個分區中;而在HASH分區中,MySQL 自動完成這些工做,你所要作的只是基於將要被哈希的列值指定一個列值或表達式,以及指定被分區的表將要被分割成的分區數量。
create table emp
(empno varchar(20) not null ,
empname varchar(20),
deptno int,
birthdate date not null,
salary int
)
partition by hash(year(birthdate))
partitions 4;
4) 建立key分區
按照KEY進行分區相似於按照HASH分區,除了HASH分區使用的用戶定義的表達式,而KEY分區的哈希函數是由MySQL 服務器提供,服務器使用其本身內部的哈希函數,這些函數是基於與PASSWORD()同樣的運算法則。「CREATE TABLE ...PARTITION BY KEY」的語法規則相似於建立一個經過HASH分區的表的規則。它們惟一的區別在於使用的關鍵字是KEY而不是HASH,而且KEY分區只採用一個或多個 列名的一個列表。
create table emp
(empno varchar(20) not null ,
empname varchar(20),
deptno int,
birthdate date not null,
salary int
)
partition by key(birthdate)
partitions 4;
5) 建立複合分區
range - hash(範圍哈希)複合分區
create table emp
(empno varchar(20) not null ,
empname varchar(20),
deptno int,
birthdate date not null,
salary int
)
partition by range(salary)
subpartition by hash(year(birthdate))
subpartitions 3
(
partition p1 values less than (2000),
partition p2 values less than maxvalue
);
range- key複合分區
create table emp
(empno varchar(20) not null ,
empname varchar(20),
deptno int,
birthdate date not null,
salary int
)
partition by range(salary)
subpartition by key(birthdate)
subpartitions 3
(
partition p1 values less than (2000),
partition p2 values less than maxvalue
);
list - hash複合分區
CREATE TABLE emp (
empno varchar(20) NOT NULL,
empname varchar(20) ,
deptno int,
birthdate date NOT NULL,
salary int
)
PARTITION BY list (deptno)
subpartition by hash(year(birthdate))
subpartitions 3
(
PARTITION p1 VALUES in (10),
PARTITION p2 VALUES in (20)
)
;
list - key 複合分區
CREATE TABLE empk (
empno varchar(20) NOT NULL,
empname varchar(20) ,
deptno int,
birthdate date NOT NULL,
salary int
)
PARTITION BY list (deptno)
subpartition by key(birthdate)
subpartitions 3
(
PARTITION p1 VALUES in (10),
PARTITION p2 VALUES in (20)
);
6) 分區表的管理操做
刪除分區:
alter table emp drop partition p1;
不能夠刪除hash或者key分區。
一次性刪除多個分區,alter table emp drop partition p1,p2;
增長分區:
alter table emp add partition (partition p3 values less than (4000));
alter table empl add partition (partition p3 values in (40));
分解分區:
Reorganizepartition關鍵字能夠對錶的部分分區或所有分區進行修改,而且不會丟失數據。分解先後分區的總體範圍應該一致。
alter table te
reorganize partition p1 into
(
partition p1 values less than (100),
partition p3 values less than (1000)
); ----不會丟失數據
合併分區:
Merge分區:把2個分區合併爲一個。
alter table te
reorganize partition p1,p3 into
(partition p1 values less than (1000));
----不會丟失數據
從新定義hash分區表:
Alter table emp partition by hash(salary)partitions 7;
----不會丟失數據
從新定義range分區表:
Alter table emp partitionbyrange(salary)
(
partition p1 values less than (2000),
partition p2 values less than (4000)
); ----不會丟失數據
刪除表的全部分區:
Alter table emp removepartitioning;--不會丟失數據
重建分區:
這和先刪除保存在分區中的全部記錄,而後從新插入它們,具備一樣的效果。它可用於整理分區碎片。
ALTER TABLE emp rebuild partitionp1,p2;
優化分區:
若是從分區中刪除了大量的行,或者對一個帶有可變長度的行(也就是說,有VARCHAR,BLOB,或TEXT類型的列)做了許多修改,可使用「ALTER TABLE ... OPTIMIZE PARTITION」來收回沒有使用的空間,並整理分區數據文件的碎片。
ALTER TABLE emp optimize partition p1,p2;
分析分區:
讀取並保存分區的鍵分佈。
ALTER TABLE emp analyze partition p1,p2;
修補分區:
修補被破壞的分區。
ALTER TABLE emp repairpartition p1,p2;
檢查分區:
可使用幾乎與對非分區表使用CHECK TABLE 相同的方式檢查分區。
ALTER TABLE emp CHECK partition p1,p2;
這個命令能夠告訴你表emp的分區p1,p2中的數據或索引是否已經被破壞。若是發生了這種狀況,使用「ALTER TABLE ... REPAIR PARTITION」來修補該分區。
【mysql分區表的侷限性】
1. 在5.1版本中分區表對惟一約束有明確的規定,每個惟一約束必須包含在分區表的分區鍵(也包括主鍵約束)。
CREATE TABLE emptt (
empno varchar(20) NOT NULL ,
empname varchar(20),
deptno int,
birthdate date NOT NULL,
salary int ,
primary key (empno)
)
PARTITION BY range (salary)
(
PARTITION p1 VALUES less than (100),
PARTITION p2 VALUES less than (200)
);
這樣的語句會報錯。MySQL Database Error: A PRIMARY KEY must include allcolumns in the table's partitioning function;
CREATE TABLE emptt (
empno varchar(20) NOT NULL ,
empname varchar(20) ,
deptno int(11),
birthdate date NOT NULL,
salary int(11) ,
primary key (empno,salary)
)
PARTITION BY range (salary)
(
PARTITION p1 VALUES less than (100),
PARTITION p2 VALUES less than (200)
);
在主鍵中加入salary列就正常。
2. MySQL分區處理NULL值的方式
若是分區鍵所在列沒有notnull約束。
若是是range分區表,那麼null行將被保存在範圍最小的分區。
若是是list分區表,那麼null行將被保存到list爲0的分區。
在按HASH和KEY分區的狀況下,任何產生NULL值的表達式mysql都視同它的返回值爲0。
爲了不這種狀況的產生,建議分區鍵設置成NOT NULL。
3. 分區鍵必須是INT類型,或者經過表達式返回INT類型,能夠爲NULL。惟一的例外是當分
區類型爲KEY分區的時候,可使用其餘類型的列做爲分區鍵( BLOB or TEXT 列除外)。
4. 對分區表的分區鍵建立索引,那麼這個索引也將被分區,分區鍵沒有全局索引一說。
5. 只有RANG和LIST分區能進行子分區,HASH和KEY分區不能進行子分區。
6. 臨時表不能被分區。
1. show create table 表名
能夠查看建立分區表的create語句
2. show table status
能夠查看錶是否是分區表
3. 查看information_schema.partitions表
select
partition_name part,
partition_expression expr,
partition_description descr,
table_rows
from information_schema.partitions where
table_schema = schema()
and table_name='test';
能夠查看錶具備哪幾個分區、分區的方法、分區中數據的記錄數等信息
4. explain partitions select語句 經過此語句來顯示掃描哪些分區,及他們是如何使用的.