MySQL高級(jí)十五——表的分區(qū)

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

? 版權(quán)聲明
THE END
喜歡就支持一下吧
點(diǎn)贊11 分享