MySQl的分區(qū)與分表
1 分區(qū)的認(rèn)識(shí)
1) 情景假設(shè)
假如有1000萬條數(shù)據(jù),放到一個(gè)表中會(huì)出現(xiàn)查詢速度很慢的情況.但是如果我們將數(shù)據(jù)分散保存到10個(gè)表中,每一個(gè)表中100萬數(shù)據(jù),這是速度就會(huì)得到很大的提升!但是讓我們手動(dòng)分表,就會(huì)造成很大的麻煩.所以我們直接使用mysql的分區(qū)技術(shù).
2) 分區(qū)的示意圖
1 雖然內(nèi)部分成了四個(gè)區(qū),但是對(duì)外提供服務(wù)的依舊是一張表.
2 存到哪里以及從哪里取,這個(gè)時(shí)候就要使用mysql內(nèi)部的分區(qū)算法.
3) 四種分區(qū)
具體為:
key hash ---->[求余方式]
range list ---->[范圍方式]
其中 key和hash 與 業(yè)務(wù)聯(lián)系不緊密,就是刪除一個(gè)分區(qū)數(shù)據(jù)不會(huì)丟失.
range 和 list 與 業(yè)務(wù)聯(lián)系緊密 ,刪除分區(qū)之后,相應(yīng)分區(qū)數(shù)據(jù)就會(huì)丟失.
注意:分表字段必須是主鍵 或 主鍵的一部分(復(fù)合主鍵索引的第二個(gè)字段)
2 key分區(qū)----取余
create table tableName (
字段.......
)engine=表引擎 partition by key (id) partitions num;
注意:這里的分區(qū)不區(qū)別表的引擎是innodb和myisam.
a 新建一個(gè)sql表實(shí)現(xiàn)分區(qū),分區(qū)字段一定是主鍵
b 查看分區(qū)的文件
以key算法分區(qū) ,參數(shù)是id级乐,分10個(gè)區(qū)(也就意味著有是個(gè)文件)
Partition by 分區(qū)算法 (參數(shù)) 分區(qū)選項(xiàng)诅岩。
c 隨機(jī)插入數(shù)據(jù)進(jìn)行測(cè)試
執(zhí)行刷新一次,才能重新將數(shù)據(jù)寫入到data中
flush tables;
d插入數(shù)據(jù)之后,查看保存數(shù)據(jù)的文件
注意:這里數(shù)據(jù)插入之后自動(dòng)分成兩個(gè)文件.
算法key是內(nèi)部指定的,到底什么數(shù)據(jù),放在哪一個(gè)分區(qū)中我們沒有辦法操作,肯能導(dǎo)致數(shù)據(jù)分配的不均勻.
3 hash分區(qū)
HASH分區(qū)主要用來確保數(shù)據(jù)在預(yù)先確定數(shù)目的分區(qū)中平均分布毡琉,要做的只是基于將要被哈希的列值指定一個(gè)列值或表達(dá)式,以 及指定被分區(qū)的表將要被分割成的分區(qū)數(shù)量蚪燕。hash分區(qū)所使用的字段一定要是主鍵!!
hash語法:
create table 表名(
.........
)engine=MyISAM partition by hash(算法函數(shù))) partitions 分區(qū)的數(shù)量;
a 新建一個(gè)學(xué)生表,讓學(xué)生信息,根據(jù)月份進(jìn)行存儲(chǔ)
create table hash_1(
id mediumint unsigned auto_increment not null,
birthday date,
primary key (id,birthday)
)engine=MyISAM partition by hash(month(birthday)) partitions 12;
解釋:
month()提取日期中的月份
hash(month(birthday)) 按照日期中的月份進(jìn)行分區(qū)
b 查看分區(qū)之后的數(shù)據(jù)文件
c 插入幾條數(shù)據(jù)進(jìn)行測(cè)試:
insert into hash_1 values(null,'1992-05-20');
insert into hash_1 values(null,'1993-06-20');
insert into hash_1 values(null,'1993-07-20');
insert into hash_1 values(null,'1993-10-20');
#注意這里的月份,不同的月份會(huì)放到不同數(shù)據(jù)文件
d 插入數(shù)據(jù)之后,查看文件的變化
注意:分區(qū)字段一定是主鍵
1 這里的month()函數(shù)是返回日期中的月份值
2 注意這里的hash()設(shè)置的值, 可以是相關(guān)的函數(shù)也可以是一個(gè)字段,不過一定要是一個(gè)整數(shù).