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

mysql分區

編輯:MySQL綜合教程

mysql分區


mysql分區: mysql分區是根據某個分區鍵(區間值,特定值列表,或者hash函數值)執行數據的聚集,讓數據根據規則分布在不同的分區中,讓一些大對象變成小對象。
mysql分區適用於一個表中的所有數據和索引,不能只對表數據分區而不對索引分區,反過來也是一樣的,不能只對索引分區而不對表分區,同時也不能只對表的一部分數據進行分區。mysql分區表上創建的索引一定是本地local索引。
在mysql5.1中,RANGE分區、LIST分區、HASH分區都要求分區鍵必須是INT類型,或者通過表達式返回INT類型,也就是說mysql5.1僅僅支持整數分區,但是KEY分區可以使用其他類型的列(BLOB或TEXT列類型除外)作為分區鍵。
無論哪種分區類型,要麼在分區表上沒有主鍵/唯一鍵,要麼分區表的主鍵/唯一鍵都必須包含分區鍵,也就是說不能使用主鍵/唯一鍵之外的其他字段進行分區。
分區類型
RANGE分區:基於一個給定連續區間范圍,把數據分配到不同的分區,使用VALUES LESS THAN進行分區定義; mysql> create table range_test( -> id int unsigned, -> name varchar(30) not null, -> age int unsigned not null, -> primary key(id,name))engine=innodb default charset=utf8 -> partition by range(id)( //使用部分主鍵來作為分區鍵 -> partition p0 values less than (10), -> partition p1 values less than (20), -> partition p2 values less than maxvalue); Query OK, 0 rows affected (0.05 sec)
注意:
partition分區按照順序來進行定義;
在Range分區中,null按照最小值來處理;
range分區適用於:
當要刪除過期數據時,只需要簡單的使用alter table emp drop partition p0來刪除p0的所有數據,對於大表來說,刪除分區比delete語句執行快;
經常執行包含分區鍵的查詢,這樣mysql只用在對應的分區中查找就可以了,提高了查詢效率;

LIST分區:類似於RANGE分區,但是LIST分區是基於枚舉出的值列表進行分區,使用partition by list(expr)來實現,expr是某列值或者一個基於某列的值返回的一個整數值的表達式,然後通過values in (value_list)的方式來定義分區,其中value_list是一個逗號分隔的整數列表; mysql> create table list_test( -> id int unsigned, -> name varchar(30) not null, -> age int unsigned not null, -> primary key(id,name))engine=innodb default charset=utf8 -> partition by list(id)( //使用部分主鍵來作為分區鍵 -> partition p0 values in (10, 5, 30), -> partition p1 values less than (20, 60, 70)); Query OK, 0 rows affected (0.05 sec)
注意:
如果插入的列值(分區表達式的返回值)不在分區鍵的值的列表中是,返回錯誤;
在Range分區中,null按照最小值來處理;

HASH分區:基於給定的分區個數,被數據分配到不同的分區。HASH分區主要用來分散熱點讀,確保數據在預先確定個數的分區中盡可能平均分布。對一個表執行HASH分區時,MYSQL會對分區鍵應用一個散列函數,以此確定數據應當放在N個分區中的哪個分區中。 HASH分兩種:
常規HASH:取模進行hash(當要增加分區或者合並分區時,所有原先的數據要進行重新分區,代價太大)
線性HASH:線性的2的冪的運算法則(在分區維護(增加、刪除、合並、拆分時)mysql處理更加迅速(因為線性HASH是以2的冪次來進行HASH的,所以不必經常進行調整,有多余的分區),缺點是數據分布不均勻)
mysql> create table hash_test( -> id int unsigned, -> name varchar(30) not null, -> age int unsigned not null, -> primary key(id,name))engine=innodb default charset=utf8 -> partition by hash(id) partitions 4;

KEY分區:類似於HASH分區,使用MYSQL提供的hash函數,對單列或者多列進行分區,支持除了BLOB和TEXT之外的所有類型作為分區鍵,如果沒有指定分區鍵,默認使用主鍵作為分區鍵,分區鍵必須為非NULL,在有大量數據時可以有效地分散熱點。 mysql> create table hash_test( -> id int unsigned, -> name varchar(30) not null, -> age int unsigned not null, -> primary key(id,name))engine=innodb default charset=utf8 -> partition by key(id) partitions 4
MYSQL分區對NULL值的處理: MYSQL不禁止在分區鍵上使用NULL,分區鍵可能是一個字段或者一個用戶定義的表達式。一般情況下,MYSQL的分區把NULL值當做零值,或者一個最小值進行處理。 在RANGE分區中是當做最小值處理,在HASH/KEY中當做零值處理,LIST分區中NULL必須出現在每句列表中,否則會出現錯誤。

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