1、為什么要采用分區(qū)?
當(dāng)數(shù)據(jù)量過(guò)大的時(shí)候(通常是指百萬(wàn)級(jí)或千萬(wàn)級(jí)數(shù)據(jù)的時(shí)候),這個(gè)時(shí)候需要將一張表的數(shù)據(jù)劃分幾張表存儲(chǔ)。一些查詢(xún)可以得到極大的優(yōu)化,這主要是借于滿(mǎn)足一個(gè)給定where語(yǔ)句的數(shù)據(jù)可以只保存在一個(gè)或多個(gè)分區(qū)內(nèi),這樣在查找時(shí)就不用查找其他剩余的分區(qū)。
2、查看一下mysql是否支持分區(qū)
通過(guò)以下命令去查看mysql是否支持分區(qū)??
show?variables?like?'%partition%';
——如果輸出的變量為yes表示mysql是支持分區(qū)的。
3、Range分區(qū)
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) );
在這個(gè)例子中, 店內(nèi)工人相關(guān)的所有行將保存在分區(qū)p0中,辦公室和支持人員相關(guān)的所有行保存在分區(qū)p1中,管理層相關(guān)的所有行保存在分區(qū)p2中。
查看分區(qū)
show?create?table?employees;
4、List分區(qū)
類(lèi)似于RANGE分區(qū),區(qū)別在于LIST分區(qū)是基于列值匹配一個(gè)離散值集合中的某一值來(lái)進(jìn)行選擇。
LIST分區(qū)通過(guò)使用”PARTITION BY LIST(expr)”來(lái)實(shí)現(xiàn),其中”expr”是某列值或一個(gè)基于某一個(gè)列值、并返回一個(gè)整數(shù)值的表達(dá)式,然后通過(guò)”VALUES IN (value_list)”的方式來(lái)定義每個(gè)分區(qū),其中”value_list”是一個(gè)通過(guò)逗號(hào)分隔的整數(shù)列表。
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分區(qū)
hash分區(qū)的目的是將數(shù)據(jù)均勻的分布到預(yù)先定義的各個(gè)分區(qū)中,保證各分區(qū)的數(shù)據(jù)數(shù)量大致一致。在RANGE和LIST分區(qū)中,必須明確指定一個(gè)給定的列值或列值集合應(yīng)該保存在哪個(gè)分區(qū)中;而在HASH分區(qū)中,MYSQL自動(dòng)完成這些工作,用戶(hù)所要做的只是基于將要被散列的列值指定一個(gè)列值或者表達(dá)式,以及指定唄分區(qū)的表將要被分割成的分區(qū)數(shù)量。
要使用HAHS分區(qū)來(lái)分割一個(gè)表,要在CREATE TABLE語(yǔ)句上添加一個(gè)PARTITION BY HASH(expr)子句,其中“expr”是返回一個(gè)整數(shù)的表達(dá)式。expr可以?xún)H僅是字段類(lèi)型為整型的列名。此外,用戶(hù)很可能需要在后面再添加一個(gè)PARTITITIONS num子句,其中num是非負(fù)的整數(shù),它表示將要被分割成分區(qū)的數(shù)量。如果沒(méi)有包含一個(gè)PARTITIONS子句,分區(qū)數(shù)量默認(rèn)為1.
create?table?t_hash?( a?int, b?datetime) partition?by?hash?(YEAR(b)) partitions?4;
LINEAR HASH分區(qū)的優(yōu)點(diǎn)在于增加、刪除、合并和拆分分區(qū)將變得更加快捷,有利于處理含有大量數(shù)據(jù)的表。缺點(diǎn)在于,與使用HASH分區(qū)得到的數(shù)據(jù)分布相比,各個(gè)分區(qū)間數(shù)據(jù)的分布可能不大均衡。
6、keys分區(qū)
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;
這個(gè)分區(qū)類(lèi)似于hash分區(qū),除了MySQL服務(wù)器使用它本身的hash表達(dá)式,不像其他類(lèi)型的分區(qū),不必要求使用一個(gè)int或null的表達(dá)式。
?以上就是MySQL高級(jí)十五——表的分區(qū)的內(nèi)容,更多相關(guān)內(nèi)容請(qǐng)關(guān)注PHP中文網(wǎng)(www.php.cn)!