mysql分表和分區(qū)的區(qū)別淺析
數(shù)據(jù)庫(kù)的數(shù)據(jù)量達(dá)到一定程度之后,為避免帶來(lái)系統(tǒng)性能上的瓶頸。需要進(jìn)行數(shù)據(jù)的處理,采用的手段是分區(qū)、分片、分庫(kù)、分表。
一、什么是mysql分表和分區(qū)
什么是分表,從表面意思上看呢,就是把一張表分成N多個(gè)小表
什么是分區(qū),分區(qū)呢就是把一張表的數(shù)據(jù)分成N多個(gè)區(qū)塊,這些區(qū)塊可以在同一個(gè)磁盤上,也可以在不同的磁盤上
二、mysql分表和分區(qū)有什么區(qū)別呢
1、實(shí)現(xiàn)方式上
a)mysql的分表是真正的分表,一張表分成很多表后,每一個(gè)小表都是完正的一張表,都對(duì)應(yīng)三個(gè)文件,一個(gè).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
簡(jiǎn)單說(shuō)明一下,上面的分表呢是利用了merge存儲(chǔ)引擎(分表的一種),alluser 是總表,下面有二個(gè)分表,user1,user2。他們二個(gè)都是獨(dú)立的表,取數(shù)據(jù)的時(shí)候,我們可以通過(guò)總表來(lái)取。這里總表是沒(méi)有.MYD,.MYI這二個(gè) 文件的,也就是說(shuō),總表他不是一張表,沒(méi)有數(shù)據(jù),數(shù)據(jù)都放在分表里面。我們來(lái)看看.MRG到底是什么東西
[root@BlackGhost test]# cat alluser.MRG |more
user1
user2
#INSERT_METHOD=LAST
從上面我們可以看出,alluser.MRG里面就存了一些分表的關(guān)系,以及插入數(shù)據(jù)的方式??梢园芽偙砝斫獬梢粋€(gè)外殼,或者是聯(lián)接池。
b)分區(qū)不一樣,一張大表進(jìn)行分區(qū)后,他還是一張表,不會(huì)變成二張表,但是他存放數(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這張表,分為二個(gè)區(qū),p1和p3,本來(lái)是三個(gè)區(qū),被我刪了一個(gè)區(qū)。我們都知道一張表對(duì)應(yīng)三個(gè)文 件.MYD,.MYI,.frm。分區(qū)呢根據(jù)一定的規(guī)則把數(shù)據(jù)文件和索引文件進(jìn)行了分割,還多出了一個(gè).par文件,打開(kāi).par文件后你可以看出他記錄 了,這張表的分區(qū)信息,根分表中的.MRG有點(diǎn)像。分區(qū)后,還是一張,而不是多張表。
2、數(shù)據(jù)處理上
a)分表后,數(shù)據(jù)都是存放在分表里,總表只是一個(gè)外殼,存取數(shù)據(jù)發(fā)生在一個(gè)一個(gè)的分表里面??聪旅娴睦樱?/p>
select * from alluser where id='12'表面上看,是對(duì)表alluser進(jìn)行操作的,其實(shí)不是的。是對(duì)alluser里面的分表進(jìn)行了操作。
b)分區(qū)呢,不存在分表的概念,分區(qū)只不過(guò)把存放數(shù)據(jù)的文件分成了許多小塊,分區(qū)后的表呢,還是一張表。數(shù)據(jù)處理還是由自己來(lái)完成。
3、提高性能上
a)分表后,單表的并發(fā)能力提高了,磁盤I/O性能也提高了。并發(fā)能力為什么提高了 呢,因?yàn)椴閷ひ淮嗡ǖ臅r(shí)間變短了,如果出現(xiàn)高并發(fā)的話,總表可以根據(jù)不同的查詢,將并發(fā)壓力分到不同的小表里面。磁盤I/O性能怎么搞高了呢,本來(lái)一個(gè) 非常大的.MYD文件現(xiàn)在也分?jǐn)偟礁鱾€(gè)小表的.MYD中去了。
b)mysql提出了分區(qū)的概念,我覺(jué)得就想突破磁盤I/O瓶頸,想提高磁盤的讀寫能力,來(lái)增加mysql性能。
在這一點(diǎn)上,分區(qū)和分表的測(cè)重點(diǎn)不同,分表重點(diǎn)是存取數(shù)據(jù)時(shí),如何提高mysql并發(fā)能力上;而分區(qū)呢,如何突破磁盤的讀寫能力,從而達(dá)到提高mysql性能的目的。
4、實(shí)現(xiàn)的難易度上
a)分表的方法有很多,用merge來(lái)分表,是最簡(jiǎn)單的一種方式。這種方式根分區(qū)難易度差不多,并且對(duì)程序代碼來(lái)說(shuō)可以做到透明的。如果是用其他分表方式就比分區(qū)麻煩了。
b)分區(qū)實(shí)現(xiàn)是比較簡(jiǎn)單的,建立分區(qū)表,根建平常的表沒(méi)什么區(qū)別,并且對(duì)開(kāi)代碼端來(lái)說(shuō)是透明的。
三、mysql分表和分區(qū)有什么聯(lián)系呢
1,都能提高mysql的性高,在高并發(fā)狀態(tài)下都有一個(gè)良好的表面。
2,分表和分區(qū)不矛盾,可以相互配合的,對(duì)于那些大訪問(wèn)量,并且表數(shù)據(jù)比較多的表,我們可以采取分表和分區(qū)結(jié)合的方式(如果merge這種分表方式,不能和分區(qū)配合的話,可以用其他的分表試),訪問(wèn)量不大,但是表數(shù)據(jù)很多的表,我們可以采取分區(qū)的方式等。
相關(guān)文章
關(guān)于SQL?Update的四種常見(jiàn)寫法
這篇文章主要介紹了關(guān)于SQL?Update的四種常見(jiàn)寫法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-08-08
快速解決mysql導(dǎo)出scv文件亂碼、躥行的問(wèn)題
這篇文章主要介紹了快速解決mysql導(dǎo)出scv文件亂碼、躥行的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-07-07
MySQL級(jí)聯(lián)復(fù)制下如何進(jìn)行大表的字段擴(kuò)容
這篇文章主要介紹了MySQL級(jí)聯(lián)復(fù)制下進(jìn)行大表的字段擴(kuò)容,庫(kù)表信息環(huán)境是Mysql 8.0.22,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-04-04
在MySQL中使用Sphinx實(shí)現(xiàn)多線程搜索的方法
這篇文章主要介紹了在MySQL中使用Sphinx實(shí)現(xiàn)多線程搜索的方法,修改Sphinx的搜索引擎配置即可,需要的朋友可以參考下2015-06-06
MySql使用存儲(chǔ)過(guò)程進(jìn)行單表數(shù)據(jù)遷移的實(shí)現(xiàn)
近期在進(jìn)行業(yè)務(wù)解耦,對(duì)冗余在一起切又屬于不同業(yè)務(wù)的代碼進(jìn)行分離,同時(shí)也將數(shù)據(jù)庫(kù)進(jìn)行分離存儲(chǔ),那么這時(shí)候就涉及到多個(gè)表的數(shù)據(jù)要進(jìn)行遷移,本文就來(lái)介紹一下MySql使用存儲(chǔ)過(guò)程進(jìn)行單表數(shù)據(jù)遷移,感興趣的可以了解一下2023-11-11
MySQL數(shù)據(jù)庫(kù)閉包Closure Table表實(shí)現(xiàn)示例
本文主要介紹了MySQL數(shù)據(jù)庫(kù)閉包Closure Table表實(shí)現(xiàn)示例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2023-01-01

