表分區,是指根據必定規則,將數據庫中的一張表分解成多個更小的,容易管理的部分。從邏輯上看,只有一張表,可是底層倒是由多個物理分區組成。
表分區有什麼好處: a.分區表的數據能夠分佈在不一樣的物理設備上,從而高效地利用多個硬件設備。
b.和單個磁盤或者文件系統相比,能夠存儲更多數據
c.優化查詢。在where語句中包含分區條件時,能夠只掃描一個或多個分區表來提升查詢效率;涉及sum和count語句時,也能夠在多個分區上並行處理,最後彙總結果。
d.分區表更容易維護。例如:想批量刪除大量數據能夠清除整個分區。
e.可使用分區表來避免某些特殊的瓶頸,例如InnoDB的單個索引的互斥訪問,ext3問價你係統的inode鎖競爭等。
今天,我經過查閱相關資料與動手操做,學習了一下數據庫表分區的技術。我的理解,其實就是當有大數據的數據表時,將數據表中的數據按照必定的規則,分門別類存儲到規定的區域空間,
若是要對錶進行「增刪改查」的操做時,執行操做的區域不會是整張表,而是該表中的某個區域,實際就是「以空間換時間」,無疑會提升執行效率。
a.一個表最多隻能有1024個分區html
b.MySQL5.1中,分區表達式必須是整數,或者返回整數的表達式。在MySQL5.5中提供了非整數表達式分區的支持。node
c.若是分區字段中有主鍵或者惟一索引的列,那麼多有主鍵列和惟一索引列都必須包含進來。即:分區字段要麼不包含主鍵或者索引列,要麼包含所有主鍵和索引列。mysql
d.分區表中沒法使用外鍵約束sql
e.MySQL的分區適用於一個表的全部數據和索引,不能只對表數據分區而不對索引分區,也不能只對索引分區而不對錶分區,也不能只對表的一部分數據分區。數據庫
命令:show variables like '%partition%'
less
其中 Variable_name 的Value = 1,我測試過了,表示能夠正常分區的。我數據庫的版本是:函數
接下來建立數據表
緊接着:
以上的報錯,說明partition by 不可以單獨的使用(stand-alone).此處要注意!
而後採起第二種用法,如圖所示:
有幾點注意:
a. 對於分區s1,表示 1 <= id < 10;對於分區s2,表示 10<= id < 20;對於分區s3,表示 20<= id < 30;對於分區s4,表示 id >= 30,無上限 b. 若是將less than(10) 和less than (20)的順序顛倒過來,那麼將報錯,如: VALUES LESS THAN value must be strictly increasing for each partition,
因此也用注意順序問題
c. 一個表最大分區爲:1024.(上面已經提到過),在有限的表分區內,最後加上 :partition xxx values less than maxvalue,是頗有必要的。
d. 無論哪一種分區類型,分區鍵必須是主鍵或惟一鍵,除非二者都沒有,否者將會報以下錯誤。
若是是將註冊日期做爲分區鍵,則需要使用日期處理函數轉換爲整型,例如year(regDate),to_days(regDate),to_seconds(regDate),且只支持這三個函數。性能
或者使用RANGE COLUMNS分區,則不須要轉換日期,以下所示學習
create table users_par( id int not null, usrName varchar(50) not null, usrEmail varchar(50) not null, age int not null, regDate date not null partition by range columns(regDate)( partition p0 values less than('2005-05-05'), partition p1 values less than('2009-09-09'), partition p2 values less than('2015-05-05'), );
RANGE分區特別適用於刪除過時數據或者某範圍數據,只須要alter table tbl_name truncate partition partition_name便可,
比delete語句效率要高不少,還有就是常用分區鍵的查詢,能夠提升查詢性能,由於只需掃描某些分區就OK
Error Code: 1503. A PRIMARY KEY must include all columns in the table's partitioning function
Hash表分區建立:
Key分區建立與Hash分區相似。能夠參考上面的。
子分區的建立:分區表中對每一個分區再次分割,又成爲複合分區。可參考:數據切分——Mysql分區表的創建及性能分析
地址:http://www.cnblogs.com/zmxmumu/p/4450857.html
分區管理補充
RANGE和LIST分區在刪除,添加,從新定義等分區管理上很是相似,以下所示。
刪除分區(alter table tbl_name drop partition partition_name),分區被刪除後,該分區的數據一塊兒被刪除。
mysql> alter table users_par drop partition p0; Query OK, 0 rows affected (0.24 sec) Records: 0 Duplicates: 0 Warnings: 0
添加分區(alter table tbl_name add partition)
mysql> alter table users_par add partition (partition p0 values less than (20)); ERROR 1481 (HY000): MAXVALUE can only be used in last partition definition --這裏報錯是由於添加分區必須在原分區的最大端添加,在爲LIST分區添加分區時,新分區的值列表的值不能包含任意一個現有分區中值列表中的值,不然報錯 mysql> alter table student add partition (partition p2 values in ('男')); ERROR 1495 (HY000): Multiple definition of same constant in list partitioning
從新定義分區(alter table tbl_name reorganize partition partition_name into),能夠將一個分區拆開成多個,反之能夠合併多個成一個或多個。
mysql> alter table users_par reorganize partition p1 into (partition p0 values less than (20),partition p1 values less t han(30)); Query OK, 1 row affected (0.05 sec) Records: 1 Duplicates: 0 Warnings: 0
須要注意的是:RANGE和LIST分區在從新定義時,只能從新定義相鄰的分區,不能夠跳過度區,而且從新定義的分區區間必須和原分區區間一致,也不能夠改變分區的類型。
HASH和KEY分區的管理
減小分區數量,使用coaleace關鍵字
mysql> alter table hash_par coalesce partition 2; Query OK, 1 row affected (0.04 sec) Records: 1 Duplicates: 0 Warnings: 0
增長分區數量
mysql> alter table hash_par add partition partitions 2; Query OK, 1 row affected (0.04 sec) Records: 1 Duplicates: 0 Warnings: 0
MySQL分區有利於查詢優化,快速刪除過時數據,提升查詢吞吐量等。
補充:http://www.cnblogs.com/zmxmumu/p/4450857.html