什麼是分表,從表面意思上看呢,就是把一張表分成n多個小表
什麼是分區,分區呢就是把一張表的資料分成n多個區塊,這些區塊可以在同一個磁盤上,也可以在不同的磁盤上,具體請參考mysql分區功能詳細介紹,以及執行個體
二,mysql分表和分區有什麼差別呢
1,實作方式上
a),mysql的分表是真正的分表,一張表分成很多表後,每一個小表都是完正的一張表,都對應三個檔案,一個.myd資料檔案,.myi索引檔案,.frm表結構檔案。

[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。他們二個都是獨 立的表,取資料的時候,我們可以通過總表來取。這裡總表是沒有.myd,.myi這二個檔案的,也就是說,總表他不是一張表,沒有資料,資料都放在分表裡 面。我們來看看.mrg到底是什麼東西

[root@blackghost test]# cat alluser.mrg |more
user1
user2
#insert_method=last
從上面我們可以看出,alluser.mrg裡面就存了一些分表的關系,以及插入資料的方式。可以把總表了解成一個外殼,或者是聯接池。
b),分區不一樣,一張大表進行分區後,他還是一張表,不會變成二張表,但是他存放資料的區塊變多了。

[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這張表,分為二個區,p1和p3,本來是三個區,被我删了一個區。我們都知道一張表對應三個檔案.myd,.myi,.frm。分區呢根據一定的規則把資料檔案和索引檔案進行了分割,還多出了一個.par檔案,打開.par檔案後你可以看出他記錄了,這張表的分區資訊,根分表中的.mrg有點像。分區後,還是一張,而不是多張表。
2,資料處理上
a),分表後,資料都是存放在分表裡,總表隻是一個外殼,存取資料發生在一個一個的分表裡面。看下面的例子:
select * from alluser where id='12'表面上看,是對表alluser進行操作的,其實不是的。是對alluser裡面的分表進行了操作。
b),分區呢,不存在分表的概念,分區隻不過把存放資料的檔案分成了許多小塊,分區後的表呢,還是一張表。資料處理還是由自己來完成。
3,提高性能上
a)分表後,單表的并發能力提高了,磁盤i/o性能也提高了。并發能力為什麼提高了呢,因為查尋一次所花的時間變短了,如果出現高并發的話,總表可以根據不同的查詢,将并發壓力分到不同的小表裡面。磁盤i/o性能怎麼搞高了呢,本來一個非常大的.myd檔案現在也分攤到各個小表的.myd中去了。
b)mysql提出了分區的概念,我覺得就想突破磁盤i/o瓶頸,想提高磁盤的讀寫能力,來增加mysql性能。eg:百萬行的表劃分為10個分區,每個分區就包含十萬行資料,那麼查詢分區需要的時間僅僅是全表掃描的十分之一了,很明顯的對比。同 時對十萬行的表建立索引的速度也會比百萬行的快得多得多。如果你能把這些分區建立在不同的磁盤上,這時候的i/o讀寫速度就“不堪設想”了(沒用錯詞,真的 太快了,理論上100倍的速度提升啊,這是多麼快的響應速度啊,是以有點不堪設想了)
在這一點上,分區和分表的測重點不同,分表重點是存取資料時,如何提高mysql并發能力上;而分區呢,如何突破磁盤的讀寫能力,進而達到提高mysql性能的目的。
4),實作的難易度上
a),分表的方法有很多,用merge來分表,是最簡單的一種方式。這種方式根分區難易度差不多,并且對程式代碼來說可以做到透明的。如果是用其他分表方式就比分區麻煩了。
b),分區實作是比較簡單的,建立分區表,根建平常的表沒什麼差別,并且對開代碼端來說是透明的。
三,mysql分表和分區有什麼聯系呢
1,都能提高mysql的性高,在高并發狀态下都有一個良好的表面。
2,分表和分區不沖突,可以互相配合的,對于那些大通路量,并且表資料比較多的表,我們可以采取分表和分區結合的方式(如果merge這種分表方式,不能和分區配合的話,可以用其他的分表試),通路量不大,但是表資料很多的表,我們可以采取分區的方式等。