MySQL 合併表、分割槽表
合併表
create table mtable1(data int not null primary key) engine=myisam; create table mtable2(data int not null primary key) engine=myisam; insert into mtable1 values(1),(2),(3); insert into mtable2 values(2),(3),(4); create table mtable(data int not null primary key) engine=merge union=(mtable1,mtable2) insert_method=last;
insert_method=last,當向合併表插入資料時,將資料插入到合併表所合併的最後一個表裡(這裡就是mtable2)
使用場景:
1) 經典的例子就是日誌記錄。日誌是隻追加的,所以可以每天用一個表。每天建立新的表並把它加入到合併表中。也可以把以前的表從合併表中移除掉,把它轉化為壓縮的MyISAM表,再把它們加回到合併表中。
2) 日誌追加這並不是合併表的唯一用途。它們通常都被用於資料倉庫程式,因為它的另一個長處就是管理大量的資料。在實際中不太可能管理一個TB級別的表,但是如果是由單個50GB的表組成的合併表,任務就會簡單很多。
當管理極其巨大的資料庫時,考慮的絕不僅僅是常規操作。還要考慮崩潰與恢復。使用小表是很好的主意。檢查和修復一系列的小表比起一個大表要快得多,尤其是大表和記憶體不匹配的時候。還可以並行地檢查和修復多個小表。
資料倉庫中另外一個顧慮就是如何清理掉老的資料。對巨型表使用DELETE語句最佳狀況下效率不高,而在最壞情況下則是一場災難。但是更改合併表的定義是很簡單的,可以使用DROP TABLE命令刪除老的資料。這可以輕易地實現自動化。
3) 合併表並非只對日誌和大量資料有效。它可以方便地按需建立繁忙的表。建立和刪除合併表的代價是很低的。索引可以像對檢視使用UNION ALL命令那樣使用合併表。但它的開銷更低,因為伺服器不會把結果放到臨時表中然後再傳遞給客戶端。這使得它對於報告和倉庫化資料非常有用。例如,要建立一個每晚都會執行的任務,它會把昨天的資料和8天前、15天前、以及之前的每一週的資料進行合併。使用合併表就可以建立無須修改的查詢,並且自動地訪問合適的資料。甚至還可以建立臨時合併表,這是檢視無法做到的。
分割槽表
作用:讓某些特定的查詢操作減少響應時間
形式:水平分割槽、垂直分割槽
show variables like '%partition%';//檢視是否支援分割槽
檢視分割槽
SELECT PARTITION_NAME,TABLE_ROWS FROM INFORMATION_SCHEMA.PARTITIONS WHERE TABLE_NAME = 'rangetable';
建立分割槽表、建立分割槽
//1、range分割槽
create table rangetable(
empno varchar(20) not null,
salary int
)
partition by range(salary)
(
partition p1 values less than(1000),
partition po values less than maxvalue
);
//或者在已有表建立分割槽
alter table rangetable partition by range(salary)
(
partition p1 values less than(1000),
partition po values less than maxvalue
);
//-----------------------------------------------------
//2、list分割槽
create table listtable(
empname varchar(20),
deptno int
)
partition by list(deptno)
(
partition p1 values in (10,20),
partition p2 values in (30,40,50)
);
//或者在已有表建立分割槽
alter table listtable partition by list(deptno)
(
partition p1 values in (10,20),
partition p2 values in (30,40,50)
);
//-----------------------------------------------------
//3、hash分割槽
create table hashtable(
id int,
name varchar(20),
birthdate date not null
)
partition by hash(year(birthdate))
partitions 4;
//通過模數演算法計算分割槽編號
//如果輸入為2018-10-10,計算過程為:
//mod(year('2018-10-10'), 4)
//=mod(2018,4)
//=2
//所以記錄儲存在分割槽編號為2的分割槽空間
//4、線性hash分割槽
create table linearhashtable(
id int,
name varchar(20),
birthdate date not null
)
partition by linear hash(year(birthdate))
partitions 4;
//與hash分割槽的不同在於計算方法不同,分割槽編號通過2的冪演算法計算得到
//5、key分割槽
create table keytable(
id int,
name varchar(20),
birthdate date not null
)
partition by key(birthdate)
partitions 4;
//使用類似password的演算法計算
//6、複合分割槽
刪除分割槽
//刪除 mytable 表的 p1 分割槽
alter table mytable drop partition p1;
新增分割槽
alter table rangetable add partition(partition p3 values less than(3000));
alter table listtable add partition(partition p3 values in (50,60));
拆分分割槽
合併分割槽