一,什么是mysql分表点寥,分區(qū)
什么是分表艾疟,從表面意思上看呢,就是把一張表分成N多個小表,具體請看mysql分表的3種方法
什么是分區(qū)蔽莱,分區(qū)呢就是把一張表的數(shù)據(jù)分成N多個區(qū)塊弟疆,這些區(qū)塊可以在同一個磁盤上,也可以在不同的磁盤上盗冷,具體請參考mysql分區(qū)功能詳細(xì)介紹怠苔,以及實(shí)例
二,mysql分表和分區(qū)有什么區(qū)別呢
1正塌,實(shí)現(xiàn)方式上
a)嘀略,mysql的分表是真正的分表,一張表分成很多表后乓诽,每一個小表都是完正的一張表帜羊,都對應(yīng)三個文件,一個.MYD數(shù)據(jù)文件鸠天,.MYI索引文件讼育,.frm表結(jié)構(gòu)文件。
[root@BlackGhost test]# ls |grep user
alluser.MRG
alluser.frm
user1.MYD
user1.MYI
user1.frm
user2.MYD
user2.MYI
user2.frm
簡單說明一下稠集,上面的分表呢是利用了merge存儲引擎(分表的一種)奶段,alluser是總表,下面有二個分表剥纷,user1痹籍,user2。他們二個都是獨(dú)立的表晦鞋,取數(shù)據(jù)的時候蹲缠,我們可以通過總表來取。這里總表是沒有.MYD,.MYI這二個文件的悠垛,也就是說线定,總表他不是一張表,沒有數(shù)據(jù)确买,數(shù)據(jù)都放在分表里面斤讥。我們來看看.MRG到底是什么東西
[root@BlackGhost test]# cat alluser.MRG |more
user1
user2
INSERT_METHOD=LAST
從上面我們可以看出,alluser.MRG里面就存了一些分表的關(guān)系湾趾,以及插入數(shù)據(jù)的方式芭商。可以把總表理解成一個外殼搀缠,或者是聯(lián)接池蓉坎。
b),分區(qū)不一樣胡嘿,一張大表進(jìn)行分區(qū)后,他還是一張表钳踊,不會變成二張表衷敌,但是他存放數(shù)據(jù)的區(qū)塊變多了勿侯。
[root@BlackGhost test]# ls |grep aa
aa#P#p1.MYD
aa#P#p1.MYI
aa#P#p3.MYD
aa#P#p3.MYI
aa.frm
aa.par
從上面我們可以看出,aa這張表缴罗,分為二個區(qū)助琐,p1和p3,本來是三個區(qū)面氓,被我刪了一個區(qū)兵钮。我們都知道一張表對應(yīng)三個文件.MYD,.MYI,.frm。分區(qū)呢根據(jù)一定的規(guī)則把數(shù)據(jù)文件和索引文件進(jìn)行了分割舌界,還多出了一個.par文件掘譬,打開.par文件后你可以看出他記錄了,這張表的分區(qū)信息呻拌,根分表中的.MRG有點(diǎn)像葱轩。分區(qū)后,還是一張藐握,而不是多張表靴拱。
2,數(shù)據(jù)處理上
a)猾普,分表后袜炕,數(shù)據(jù)都是存放在分表里,總表只是一個外殼初家,存取數(shù)據(jù)發(fā)生在一個一個的分表里面偎窘。看下面的例子:
select * from alluser where id='12'表面上看笤成,是對表alluser進(jìn)行操作的评架,其實(shí)不是的。是對alluser里面的分表進(jìn)行了操作炕泳。
b)纵诞,分區(qū)呢,不存在分表的概念培遵,分區(qū)只不過把存放數(shù)據(jù)的文件分成了許多小塊浙芙,分區(qū)后的表呢,還是一張表籽腕。數(shù)據(jù)處理還是由自己來完成嗡呼。
3,提高性能上
a)皇耗,分表后南窗,單表的并發(fā)能力提高了,磁盤I/O性能也提高了。并發(fā)能力為什么提高了呢万伤,因?yàn)椴閷ひ淮嗡ǖ臅r間變短了窒悔,如果出現(xiàn)高并發(fā)的話,總表可以根據(jù)不同的查詢敌买,將并發(fā)壓力分到不同的小表里面简珠。磁盤I/O性能怎么搞高了呢,本來一個非常大的.MYD文件現(xiàn)在也分?jǐn)偟礁鱾€小表的.MYD中去了虹钮。
b)聋庵,mysql提出了分區(qū)的概念,我覺得就想突破磁盤I/O瓶頸芙粱,想提高磁盤的讀寫能力祭玉,來增加mysql性能。在這一點(diǎn)上宅倒,分區(qū)和分表的測重點(diǎn)不同攘宙,分表重點(diǎn)是存取數(shù)據(jù)時,如何提高mysql并發(fā)能力上拐迁;而分區(qū)呢蹭劈,如何突破磁盤的讀寫能力,從而達(dá)到提高mysql性能的目的线召。
4)铺韧,實(shí)現(xiàn)的難易度上
a),分表的方法有很多缓淹,用merge來分表哈打,是最簡單的一種方式。這種方式根分區(qū)難易度差不多讯壶,并且對程序代碼來說可以做到透明的料仗。如果是用其他分表方式就比分區(qū)麻煩了。
b)伏蚊,分區(qū)實(shí)現(xiàn)是比較簡單的立轧,建立分區(qū)表,根建平常的表沒什么區(qū)別躏吊,并且對開代碼端來說是透明的氛改。
三,mysql分表和分區(qū)有什么聯(lián)系呢
1比伏,都能提高mysql的性高胜卤,在高并發(fā)狀態(tài)下都有一個良好的表面。
2赁项,分表和分區(qū)不矛盾葛躏,可以相互配合的澈段,對于那些大訪問量,并且表數(shù)據(jù)比較多的表舰攒,我們可以采取分表和分區(qū)結(jié)合的方式(如果merge這種分表方式均蜜,不能和分區(qū)配合的話,可以用其他的分表試)芒率,訪問量不大,但是表數(shù)據(jù)很多的表篙顺,我們可以采取分區(qū)的方式等偶芍。