mysql 表分區技術

表分區,是指根據必定規則,將數據庫中的一張表分解成多個更小的,容易管理的部分。從邏輯上看,只有一張表,可是底層倒是由多個物理分區組成。

表分區有什麼好處: 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的分區適用於一個表的全部數據和索引,不能只對表數據分區而不對索引分區,也不能只對索引分區而不對錶分區,也不能只對表的一部分數據分區。數據庫

 
 

  如何判斷當前MySQL是否支持分區

  命令:show variables like '%partition%'less

    

   其中 Variable_name 的Value = 1,我測試過了,表示能夠正常分區的。我數據庫的版本是:函數

  

 
 

    MySQL支持的分區類型有RANGE分區,LIST分區,HASH分區,KEY分區。其中RANGE,LIST,HASH分區等通常使用Int類型,KEY分區使用BLOB,TEXT類型等。


接下來建立數據表

緊接着:

以上的報錯,說明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
 
 接下來,咱們查看,咱們創建的分區,相關的語法: EXPLAIN PARTITIONS SELECT * FROM `demo`
 
  固然,咱們須要作測試,「實踐是檢驗真理的惟一標準」嘛。
 
 
 
 語法: explain partitions sql語句,如
 
 等等,也能夠作其餘的測試。
 接下來,嘗試其餘方式的表分區形式。
  List 表分區建立:
語法:desc partitions select * from table_name;
同時,語法:show create table table_name;


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
相關文章
相關標籤/搜索