MySQL高級十五——表的分區

1、為什么要采用分區?

當數據量過大的時候(通常是指百萬級或千萬級數據的時候),這個時候需要將一張表的數據劃分幾張表存儲。一些查詢可以得到極大的優化,這主要是借于滿足一個給定where語句的數據可以只保存在一個或多個分區內,這樣在查找時就不用查找其他剩余的分區。

2、查看一下mysql是否支持分區

通過以下命令去查看mysql是否支持分區??

show?variables?like?'%partition%';

——如果輸出的變量為yes表示mysql是支持分區的。

3、Range分區

CREATE?TABLE?employees?(    id?INT?NOT?NULL,    fname?VARCHAR(30),    lname?VARCHAR(30),    hired?DATE?NOT?NULL?DEFAULT?'1970-01-01',    separated?DATE?NOT?NULL?DEFAULT?'9999-12-31',    job_code?INT?NOT?NULL,    store_id?INT?NOT?NULL  )    partition?BY?RANGE?(store_id)?(  	partition?p0?VALUES?LESS?THAN?(6),  	partition?p1?VALUES?LESS?THAN?(11),  	partition?p2?VALUES?LESS?THAN?(16),  	partition?p3?VALUES?LESS?THAN?(21)  );

在這個例子中, 店內工人相關的所有行將保存在分區p0中,辦公室和支持人員相關的所有行保存在分區p1中,管理層相關的所有行保存在分區p2中。

查看分區

show?create?table?employees;

4、List分區

類似于RANGE分區,區別在于LIST分區是基于列值匹配一個離散值集合中的某一值來進行選擇。

LIST分區通過使用”PARTITION BY LIST(expr)”來實現,其中”expr”是某列值或一個基于某一個列值、并返回一個整數值的表達式,然后通過”VALUES IN (value_list)”的方式來定義每個分區,其中”value_list”是一個通過逗號分隔的整數列表。

create?table?category_part(?cid?int?unsigned?not?null?auto_increment,cname?varchar(64)?not?null,parent_id?int?not?null,primary?key?(cid,parent_id))  partition?by?list(parent_id)(  partition?p1?values?in?(1,2,3,6,9),  partition?p2?values?in?(4,5,10,22,23),  partition?p3?values?in?(7,8,11,12,13),  partition?p4?values?in?(14,15,16,17,20),  partition?p5?values?in?(18,19,21,24,25)  );

5、HASH分區

hash分區的目的是將數據均勻的分布到預先定義的各個分區中,保證各分區的數據數量大致一致。在RANGE和LIST分區中,必須明確指定一個給定的列值或列值集合應該保存在哪個分區中;而在HASH分區中,MYSQL自動完成這些工作,用戶所要做的只是基于將要被散列的列值指定一個列值或者表達式,以及指定唄分區的表將要被分割成的分區數量。

要使用HAHS分區來分割一個表,要在CREATE TABLE語句上添加一個PARTITION BY HASH(expr)子句,其中“expr”是返回一個整數的表達式。expr可以僅僅是字段類型為整型的列名。此外,用戶很可能需要在后面再添加一個PARTITITIONS num子句,其中num是非負的整數,它表示將要被分割成分區的數量。如果沒有包含一個PARTITIONS子句,分區數量默認為1.

create?table?t_hash?(  a?int,  b?datetime)  partition?by?hash?(YEAR(b))  partitions?4;

LINEAR HASH分區的優點在于增加、刪除、合并和拆分分區將變得更加快捷,有利于處理含有大量數據的表。缺點在于,與使用HASH分區得到的數據分布相比,各個分區間數據的分布可能不大均衡。

6、keys分區

create?table?orders_key  (  id?int?auto_increment,  customer_surname?varchar(30),  store_id?int,  alesperson_id?int,  order_Date?date,  note?varcahr(500),  index_idx(id)  )?engine=myisam?partition?by?key(order_date)?partitions?4;

這個分區類似于hash分區,除了MySQL服務器使用它本身的hash表達式,不像其他類型的分區,不必要求使用一個int或null的表達式。

?以上就是MySQL高級十五——表的分區的內容,更多相關內容請關注PHP中文網(www.php.cn)!

? 版權聲明
THE END
喜歡就支持一下吧
點贊11 分享