mysql分区、分表学习
分區(qū)
一、什么是表分區(qū)
通俗地講表分區(qū)是將一大表,根據(jù)條件分割成若干個(gè)小表。mysql5.1開(kāi)始支持?jǐn)?shù)據(jù)表分區(qū)了。
如:某用戶(hù)表的記錄超過(guò)了600萬(wàn)條,那么就可以根據(jù)入庫(kù)日期將表分區(qū),也可以根據(jù)所在地將表分區(qū)。當(dāng)然也可根據(jù)其他的條件分區(qū)。
使用表分區(qū)技術(shù)對(duì)客戶(hù)端沒(méi)有影響相當(dāng)于所有的數(shù)據(jù)還是存放在一張表中,但是相對(duì)于mysql內(nèi)部來(lái)講,卻是將數(shù)據(jù)拆分存放在不同位置中,就好比一個(gè)文件夾下文件過(guò)多需要整理存放在不同子文件夾中一樣。
二、為什么要對(duì)表進(jìn)行分區(qū)
為了改善大型表以及具有各種訪(fǎng)問(wèn)模式的表的可伸縮性,可管理性和提高數(shù)據(jù)庫(kù)效率。
分區(qū)的一些優(yōu)點(diǎn)包括:
三、分區(qū)類(lèi)型
四、各分區(qū)詳細(xì)介紹
1.range分區(qū)
CREATE TABLE employees (id INT NOT NULLstore_id int ) 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 MAXVALUE );- 這樣p0-p5的店員會(huì)保存在p0,p6-p10的店員會(huì)保存在p1,以此類(lèi)推。MAXVALUE為常量表示最大的可能的整數(shù)值。
- 這里最值得注意的限制是MySQL 必須能夠計(jì)算表達(dá)式的返回值作為L(zhǎng)ESS THAN (<)比較的一部分;因此,表達(dá)式的值不能為NULL。
RANGE分區(qū)在如下場(chǎng)合特別有用:
2.list分區(qū)
假定有20個(gè)音像店,分布在4個(gè)有經(jīng)銷(xiāo)權(quán)的地區(qū),如下表所示:
| 東區(qū) | 1,2,3,4 |
| 西區(qū) | 11,12 |
| 南區(qū) | 5,6,7 |
| 北區(qū) | 8,9,10 |
要按照屬于同一個(gè)地區(qū)商店的行保存在同一個(gè)分區(qū)中的方式來(lái)分割表,可以使用下面的“CREATE TABLE”語(yǔ)句:
CREATE TABLE employees (id INT NOT NULLstore_id int ) partition BY LIST(store_id)(partition pNorth VALUES IN (8,9,10),partition pEast VALUES IN (1,2,3,4),partition pWest VALUES IN (5,6,7),partition pSouth VALUES IN (11,12) );這使得在表中增加或刪除指定地區(qū)的雇員記錄變得容易起來(lái)。例如,假定西區(qū)的所有音像店都賣(mài)給了其他公司。那么與在西區(qū)音像店工作雇員相關(guān)的所有記錄(行)可以使用查詢(xún)“ALTER TABLE employees DROP PARTITION pWest;”來(lái)進(jìn)行刪除,它與具有同樣作用的DELETE (刪除)查詢(xún)“DELETE query DELETE FROM employees WHERE store_id IN (4,12,13,14,18);”比起來(lái),要有效得多。
【要點(diǎn)】:如果試圖插入列值(或分區(qū)表達(dá)式的返回值)不在分區(qū)值列表中的一行時(shí),那么“INSERT”查詢(xún)將失敗并報(bào)錯(cuò)。例如,假定LIST分區(qū)的采用上面的方案,下面的查詢(xún)將失敗:
INSERT INTO employees VALUES(224, 'Linus', 'Torvalds', '2002-05-01', '2004-10-12',?42,?21);這是因?yàn)椤皊tore_id”列值21不能在用于定義分區(qū)pNorth, pEast, pWest,或pCentral的值列表中找到。要重點(diǎn)注意的是,LIST分區(qū)沒(méi)有類(lèi)似如“VALUES LESS THAN MAXVALUE”這樣的包含其他值在內(nèi)的定義。將要匹配的任何值都必須在值列表中找到。
3.hash分區(qū)
CREATE TABLE employees (id INT NOT NULLstore_id int ) PARTITION BY HASH(store_id)PARTITIONS 4;hash分區(qū)的目的是將數(shù)據(jù)均勻的分布到預(yù)先定義的各個(gè)分區(qū)中,保證各分區(qū)的數(shù)據(jù)數(shù)量大致一致。
4.key分區(qū)
CREATE TABLE employees (id INT NOT NULLstore_id int ) PARTITION BY key(store_id)PARTITIONS 4;類(lèi)似于按HASH分區(qū),區(qū)別在于KEY分區(qū)只支持計(jì)算一列或多列,且MySQL 服務(wù)器提供其自身的哈希函數(shù)。必須有一列或多列包含整數(shù)值。
五、管理分區(qū)語(yǔ)法
取余:key,hash
增加分區(qū)數(shù)量
alter?table?employees?add?partition?partitions?1;減少分區(qū)數(shù)量
alter?table?employees?coalesce?partition?1;采用取余算法的分區(qū)數(shù)量的修改,不會(huì)導(dǎo)致已有數(shù)據(jù)的丟失
條件:list,range
增加分區(qū)數(shù)量
alter table employees add partition (partition pCenter VALUES IN (13,14) )刪除分區(qū)
alter?table?employees?drop?partition?pNorth;==注意==:刪除條件算法的分區(qū)將會(huì)導(dǎo)致已有數(shù)據(jù)的丟失
六、選擇分區(qū)算法
平均分配(key,hash):就按照主鍵進(jìn)行key即可(非常常見(jiàn))
按照某種業(yè)務(wù)邏輯進(jìn)行分區(qū)(range,list):選擇那種整數(shù)型做分區(qū)字段或者最容易被篩選的字段
分表
1.水平分表:根據(jù)一列或多列數(shù)據(jù)的值把數(shù)據(jù)行放到兩個(gè)獨(dú)立的表中。
2.垂直分割:把主碼和一些列放到一個(gè)表,然后把主碼和另外的列放到另一個(gè)表中。
原來(lái)一個(gè)表中有a,b,c,d四個(gè)字段,垂直就是豎著切一刀,分成a,b一個(gè)表,c,d一個(gè)表。通過(guò)同一個(gè)字段關(guān)聯(lián)起來(lái)。
水平么,比如將ID=1的用戶(hù)所產(chǎn)生的所有記錄放在Table1,ID=2的放在Table2,兩個(gè)Table字段完全一樣。。
主要就是豎著切一刀,或者橫著切一刀的區(qū)別。
總結(jié)
以上是生活随笔為你收集整理的mysql分区、分表学习的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: OkHttp学习
- 下一篇: mysql索引及优化