程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> MYSQL數據庫 >> MySQL綜合教程 >> mysql分區,mysql分區技術

mysql分區,mysql分區技術

編輯:MySQL綜合教程

mysql分區,mysql分區技術


    分區
  就訪問數據庫的應用而言,邏輯上只有一個表或一個索引,但是實際上這個表可能由數10個物理分區對象組成,每個分區都是一個獨立的對象,可以獨自處理,可以作為表的一部分進行處理。  
  • 分區對應用來說是完全透明的,不影響應用的業務邏輯
  • 創建分區,是對數據表,和索引表,同時創建分區的。
  • 不能分別創建分區;同時也不能對部分數據進行分區;
  • 分區在創建完成之後,管理員也無法動態更改;
    mysql分區的優點主要包括:
  • 和單個磁盤或者文件系統分區相比,可以存儲更多數據
  • 優化查詢。在where子句中包含分區條件時,可以只掃描必要的一個或多個分區來提高查詢效率。
  • 對於已經過期或者不需要保存的數據,可以通過刪除與這些數據有關的分區來快速刪除數據
  • 跨多個磁盤來分散數據查詢,以獲得更大的查詢吞吐量
  分區鍵:partition key   查看是否支持分區:  
mysql> show variables like '%partition%';
+-------------------+-------+
| Variable_name     | Value |
+-------------------+-------+
| have_partitioning | YES   |
+-------------------+-------+

 

分區類型
 
  • range分區:基於一個給定連續區間范圍,把數據分配到不同的分區。
  • list分區:類似range分區,區別在於list分區是基於枚舉的值列表分區,range是基於給定的連續區間范圍分區
  • hash分區:基於給定的分區個數,把數據分配到不同的分區
  • key分區:類似與hash分區
  5.1 版本range,list,hash,分區鍵,必須是int,或者表達式返回int類型; 5.5 版本 的range,list分區,已經支持非整數分區了;   key分區,可以使用除blob,text之外的類型列作為分區鍵;   如果存在主鍵/唯一鍵字段,則不能使用除主鍵/唯一鍵字段之外的其他字段進行分區。   range分區: 利用取值范圍將數據分成分區,區間要連續並且不能相互重疊; 使用values less than 操作符按照進行分區定義:   注意:分區只能在建表的時候進行,建完表之後,只能增加分區內容;    PARTITION BY RANGE (store_id) ( PARTITION p0 VALUES LESS THAN (10) )  
 
mysql> show create table emp;
| emp   | CREATE TABLE `emp` (
  `id` int(11) NOT NULL,
  `store_id` int(11) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1
/*!50100 PARTITION BY RANGE (store_id)
(PARTITION p0 VALUES LESS THAN (10) ENGINE = InnoDB) */ |
1 row in set (0.00 sec)
 
mysql> insert into emp values(1,11);
ERROR 1526 (HY000): Table has no partition for value 11
mysql> insert into emp values(1,10);
ERROR 1526 (HY000): Table has no partition for value 10
mysql> insert into emp values(1,9);
Query OK, 1 row affected (0.01 sec)
只可以插入,鍵值范圍內的值;上面只能插入比10小的store_id;    
mysql> alter table emp add partition (partition p1 values less than (20));
Query OK, 0 rows affected (0.06 sec)
mysql> insert into emp values(2,18);
Query OK, 1 row affected (0.00 sec)
新增了一個分區p1,范圍小於20,大於等於p0 的10;分區增加應該是連續的從p0開始。     VALUES LESS THAN MAXVALUE :比最大值大的其他值的分區;list中不存在;   在5.5版本後,range支持非整數 分區;使用關鍵字 PARTITION BY RANGE COLUMNS (name),如下面例子:按時間分區;  
PARTITION BY RANGE COLUMNS (TIME) (
     PARTITION p0 VALUES LESS THAN ('1996-01-01'),
     PARTITION p2 VALUES LESS THAN ('2006-01-01')
)
在mysql5.1中分區日期處理上只有year(),to_days(),兩種;而5.5分區日期處理增加了to_seconds(),把日期轉化成秒;     range分區功能特別適合以下兩種情況:
  • 當需要刪除過期的數據時。只需要alter table emp drop partition p0 來刪除p0分區中的數據。對於上百萬條記錄的表來說,刪除分區要比運行一個delete 語句有效得多
  • 經常運行包含分區鍵的查詢,mysql可以很快地確定只有某一個或某些分區需要掃描。例如,上述例子中檢索store_id ,大於10的記錄,mysql只需要掃描p1 ;
  可以使用explain 來檢測,查詢使用的是哪個分區;   List分區: list 分區是建立離散的值列表告訴數據庫特定的值屬於哪個分區,與range相似,區別是list分區是從屬一個枚舉列表的值的集合,range分區是從屬一個連續區間值的集合。  
partition by list (id) (
     partition p0 values in (3,5),
     partition p1 values in (1,10),
     partition p0 values in (4,6),
     partition p1 values in (2,8),
)
 

 

插入只可以是,分區中枚舉出來的值;且沒有 像range 分區中 values less than maxvalue 這樣包含其他值在內的定義方式;   同樣,在mysql5.5 之後可以支持非整數分區:  
partition by list  columns (category) (
     partition p0 values in ('lodging','food'),
     partition p1 values in ('good','bad'),
     partition p0 values in ('flights','groud')
)

 

columns 分區支持:   注意:columns分區僅支持一個或多個字段名作為分區鍵,不支持表達式作為分區鍵,這個和不帶 columns的range,list 分區 有區別;   多字段分區是,columns 分區的一個亮點; 多字段分區鍵的比較就是多列排序,先根據a字段排序,再根據b字段排序,然後根據排序結果來分區存放數據。和range單字段分區排序的規則實際上是一致的。  
partition by range colulmns (a,b)(
 
     partition p01 values less than (0,10),
     partition p02 values less than (10,10),
     partition p03 values less than (10,20)
)
假設 partition p01 values less than (ma,mb), 此時進行元組比較:(a<ma)  or ( a=ma and b<mb); 即先比較a,如果a小於ma,則直接存,當a=ma且b<mb時 也是符合要求的;     Hash分區 主要用來分散熱點讀,確保數據在預先確定個數的分區中盡可能平均分布;   在執行hash分區時,mysql會對分區鍵應用一個散列函數,以此確定數據應當放在N個分區中的哪個分區中。     hash分區:
  • 常規hash分區:通過MOD()取模的方式,確定插入數據在具體哪個分區內。
    • 語法:partition by hash (id) partition 4;分成4個分區;
  • 線性hash分區:分區函數是一個線性的2的冪的運算法則,確定插入數據在具體哪個分區內。
    • 語法:partition by linear hash (id) partition 4
    • 優點:在分區維護(包含,增加,刪除,合並,拆分分區)時,mysql能夠處理得更加迅速;
    • 缺點:對比常規hash分區(取模)的時候,線性hash各個分區之間數據的分布不太均衡
    key分區 類似與hash分區;hash分區允許使用用戶自定義的表達式,key分區不允許使用用戶自定義的表達式,需要使用mysql服務器提供的hash函數。同時hash分區只支持整數分區,而key分區支持使用除blob,text以外的其他類型;   與hash分區不同,創建可以分區表的時候,可以不指定分區鍵,默認會首先選擇使用主鍵作為分區鍵;沒有主鍵時,會選擇非空唯一鍵作為分區鍵;     子分區 對分區表中每一個分區再次分割,又被稱為復合分區;適合用於保存非常大量的數據記錄;   mysql分區處理null值的方式
  mysql禁止分區鍵值使用null,分區鍵可能是一個字段或者一個用戶定義的表達式;  
  • range分區中,null值會被當做最小值來處理;
  • list分區中,null值必須出現在枚舉列表中,否則不接受
  • hash/key,null值會被當做零值來處理;
  分區管理
  使用alter table 來對分區進行,添加,刪除,重定義,合並,拆分分區的命令;   range和list: 刪除:
alter table emp drop partition p1;
增加:
alter table emp add partition (partition p3 values less than (2000) )

假設原有p1,p2,p3,現在要增加一個分區,px的命名隨意,但是values less than (xxx)一定是大於當前分區中最大值的;

  拆分:將p3分區(2000--2015)分為兩個分區p2(2000-2005)和p3(2005-2015)
alter table emp reorganize partition p3 into (partition p2 values less than (2005),partition p3 values less than (2015) )
  合並:將p3分區(30),p4(40) 合並成 p2(40);
mysql> alter table emp reorganize partition p3,p4 into  (partition p2 values less than (40)); 

注意:p3,p4,合並後范圍只能變大,不能縮小;即 p2 范圍>=40;

  • 拆分與合並,後范圍只能變大,不能縮小;
  • 同時不能與其他分區 重疊,即只能夠重新定義相鄰的分區,不能跳分區進行重定義;
  hash和key分區管理: hash分區,刪除,當是它可以從4個分區合並為兩個分區
    • alter table emp coalesce partition 2;
    • coalesce 不能用來增加分區數量
  hash分區,增加分區,例如當前emp 有兩個分區,現在增加8個分區,使分區數達到10個;
    • alter table emp add partition  partition 8   
  相關命令
 
- PARTITION BY RANGE (store_id) ( PARTITION p0 VALUES LESS THAN (10) )
- PARTITION BY RANGE COLUMNS (TIME) ( PARTITION p0 VALUES LESS THAN ('1996-01-01'),PARTITION p2 VALUES LESS THAN ('2006-01-01') )
- partition by range colulmns (a,b) ( partition p01 values less than (0,10) )
- VALUES LESS THAN MAXVALUE :比最大值大的其他值的分區;list中不存在;
- partition by list (id) ( partition p0 values in (3,5))
- partition by list  columns (category) ( partition p0 values in ('lodging','food') )
- partition by hash (id) partition 4;
- alter table emp drop partition p1;
- altertable emp add partition (partition p3 values less than (2000) )
- alter table emp reorganize partition p3 into (partition p2 values less than (2005),partition p3 values less than (2015) )
- alter table emp reorganize partition p3,p4 into  (partition p2 values less than (40));
- alter table emp coalesce partition 2;
- alter table emp add partition  partition 8
 

 

 總結
 
  • 分區特點:
    • 對應用是透明的
    • 對數據表和索引表同時創建分區
    • 創建完成後無法動態修改這裡指的是已經表結構中指定分區字段
    • 不能對部分數據進行分區,
  •  分區優點:
    • 優化查詢
    • 存儲更多數據
    • 分區處理過期數據
    • 跨盤查詢提高吞吐量
  •  range:
    • 基與給定區間范圍,把數據分配到不同分區;
    • 區間要連續並且不能相互重疊;
    • 特別適合:
      • 當需要刪除過期的數據時
      • 經常運行包含分區鍵的查詢。
  •  list:
    • 類似range分區,list分區是基於枚舉值列表分區;
    • 插入只可以是,分區中枚舉出來的值;
  •  hash:
    • 基於給定的分區個數,把數據均勻分配到不同的分區;
    • 主要用來分散熱點讀;
  •  KEY:類似與hash分區
  •  如存在主鍵/唯一鍵字段,則只能使用其作為分區字段
  •  columns 分區:partition by range colulmns(time);
  •  多字段分區 :
    • partition by range colulmns (a,b) (partition p01 values less than (ma,mb));
    • 先比較a,如果a小於ma,則直接存,當a=ma且b<mb時 也是符合要求的;
  •  分區管理:
    • range和list:增,刪,合並,拆分;
    • 拆分與合並,後范圍只能變大,不能縮小;
    • 同時不能與其他分區 重疊,只能夠重新定義相鄰的分區,不能跳分區進行重定義;
  • hash:刪,增;
 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved