需求:大數據。解決方案:分而治之,更細一點即爲。將大表和大索引分爲一個更小的操做單元
在mysql中,分區容許將表、索引和索引編排表細分爲更小的單元。分區後,每一個分區有本身單獨的名稱。對於DBA來說,這些分區能夠統一管理,也能夠分開管理。
可是對於應用程序來說,分區的表和沒有分區的表示同樣的。換句話來說,分區對於應用是透明的,只是數據庫對於數據的從新整理。
Mysql分區,這個是mysql對於分區的官方解釋。mysql
a)提高性能
應該說,幾乎全部分區的目的都是用來提高性能的。不是誰哪天早上吃着雞蛋灌餅,說我們分個區玩玩吧!不是的。那麼分區是如何來提高檢索數據的性能的呢?沒有分區以前,數據每次在查詢和檢索老是面向的是整個數據庫和表。分區以後,mysql針對每一個分區生成特定的數據文件與索引文件。每次只會檢索特定的部分數據,所以能夠更好的來執行和維護數據庫。究其緣由仍是由於在分區以後表指派到不一樣的物理驅動器上,這樣即可在同時訪問多個分區時減小物理 I/O 爭用。
b)易於管理
對於一些無用的冗餘的歷史數據來說,能夠根據分區以後直接刪除相應的分區。操做起來更加簡便,由於執行數以萬計的數據遠比直接刪除文件來的困難的多、時間也更加的長。
c)容錯
分區以後相比分區以前,一張表從以前一個文件分爲如今的三個文件。分區以後即便一個文件出現破壞,也不會影響其餘數據。
2..經常使用分區方法
RANGE分區
LIST分區
HASH分區
KEY分區sql
2、如何分區?數據庫
1.查看數據庫是否支持分區服務器
SHOW VARIABLES LIKE '%partition%';
對於mysql來說,現階段支持分區操做的版本有5.1和5.5.如圖顯示爲YES則代表該數據庫支持分區操做。less
俗稱:範圍分區。根據表的字段的值,依據給定某段連續的區間來分區。函數
直接建立表時分區性能
create table teacher (id varchar(20) not null , name varchar(20), age varchar(20), birthdate date not null, salary int ) partition by range(year(birthdate)) ( partition p1 values less than (1970), partition p2 values less than (1990), partition p3 values less than maxvalue );
Ps:建立teacher表,並在建立teacher表同時根據birthdate字段將表劃分爲p一、p二、p3三個分區。大數據
在建立表後分區spa
ALTER TABLE teacher partition by range(year(birthdate)) ( partition p1 values less than (1970), partition p2 values less than (1990), partition p3 values less than maxvalue );
Ps:給已經建立了的表分區,分爲p一、p二、p3.索引
俗名:列表分區。其實list分區和range分區應該說都是同樣的,不一樣的是range分區在分區是的依據是一段連續的區間;而list分區針對的分區依據是一組分佈的散列值。
create table student (id varchar(20) not null , studentno int(20) not null, name varchar(20), age varchar(20) ) partition by list(studentno) ( partition p1 values in (1,2,3,4), partition p2 values in (5,6,7,8), partition p3 values in (9,10,11) );
Ps:如上建立表student,並將student表分爲p一、p二、p3三個分區。須要注意的是通常狀況下,針對表的分區字段爲int等數值類型。
小名:哈希分區。哈希分區主要是依據表的某個字段以及指定分區的數量。
create table user ( id int(20) not null, role varchar(20) not null, description varchar(50) ) partition by hash(id) partitions 10;
Ps:如上建立user表,並將user表平均分爲十個分區。比較有限制的就是須要知道表的數據有多少才能更好平均分配分區。
相似於按HASH分區,區別在於KEY分區只支持計算一列或多列,且MySQL服務器提供其自身的哈希函數。必須有一列或多列包含整數值。
create table role( id int(20) not null,name varchar(20) not null) partition by linear key(id) partitions 10;
對指定表添加分區
alter table user add partition(partition p4 values less than MAXVALUE);
刪除指定表指定分區
alter table student drop partition p1;
建立子分區
create table role_subp(id int(20) not null,name int(20) not null) partition by list(id) subpartition by hash(name) subpartitions 3 ( partition p1 values in(10), partition p2 values in(20) )
複合分區
alter table user reorganize partition p1,p3 into (partition p1 values less than (1000));