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)!