分表和分割槽的區別

2022-06-20 07:42:12 字數 4605 閱讀 8107

一,什麼是mysql分表,分割槽 

什麼是分表,從表面意思上看呢,就是把一張表分成n多個小表,具體請看:mysql分表的3種方法

什麼是分割槽,分割槽呢就是把一張表的資料分成n多個區塊,這些區塊可以在同乙個磁碟上,也可以在不同的磁碟上,具體請參考mysql分割槽功能詳細介紹,以及例項 

a),mysql的分表是真正的分表,一張表分成很多表後,每乙個小表都是完正的一張表,都對應三個檔案,乙個.myd資料檔案,.myi索引檔案,.frm表結構檔案。 

sql**

[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到底是什麼東西 

sql**

[root@blackghost test]# cat alluser.mrg |more

user1

user2

#insert_method=last

從上面我們可以看出,alluser.mrg裡面就存了一些分表的關係,以及插入資料的方式。可以把總表理解成乙個外殼,或者是聯接池。 

b)分割槽不一樣,一張大表進行分割槽後,他還是一張表,不會變成二張表,但是他存放資料的區塊變多了。 

sql**

[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,本來是三個區,被我刪了乙個區(p開頭的帶數字的是區)。我們都知道一張表對應三個檔案.myd,.myi,.frm。分 區呢根據一定的規則把資料檔案和索引檔案進行了分割,還多出了乙個.par檔案,開啟.par檔案後你可以看出他記錄了,這張表的分割槽資訊,根分表中 的.mrg有點像。分割槽後,還是一張,而不是多張表。 

如orderid,userid,ordertime,.....

ordertime<2015-01-01 #p0

ordertime<2015-04-01 #p1

ordertime<2015-07-01 #p2

ordertime<2015-10-01 #p3

ordertime<2016-01-01 #p4

按照時間分割槽。大部分只查詢最近的訂單資料,那麼大部分只訪問乙個分割槽,比整個錶小多了,資料庫可以更加好的快取,效能也提高了。這個是資料庫分的,應用程式透明,無需修改。

a)分表後,資料都是存放在分表裡,總表只是乙個外殼,訪問資料發生在乙個乙個的分表裡面。看下面的例子: 

select * from alluser where id='12'表面上看,是對錶alluser進行操作的,其實不是的。是對alluser裡面的分表進行了操作。 

b)分割槽呢,不存在分表的概念,分割槽只不過把存放資料的檔案分成了許多小塊,分割槽後的表呢,還是一張表。資料處理還是由表自己來完成。 

a), 分表後,單錶的併發能力提高了,磁碟i/o效能也提高了。併發能力為什麼提高了呢,因為查尋一次所花的時間變短了,如果出現高併發的話,總表可以根據不同 的查詢,將併發壓力分到不同的小表裡面。磁碟i/o效能怎麼搞高了呢,本來乙個非常大的.myd(資料)檔案現在也分攤到各個小表的.myd中去了。 

b),mysql提出了分割槽的概念,我覺得就想突破磁碟i/o瓶頸,想提高磁碟的讀寫能力,來增加mysql效能。 

在這一點上,分割槽和分表的測重點不同,分表重點是訪問資料時,如何提高mysql併發能力上;而分割槽呢,如何突破磁碟的讀寫能力,從而達到提高mysql效能的目的。 

4),實現的難易度上 

a),分表的方法有很多,用merge來分表,是最簡單的一種方式。這種方式根分割槽難易度差不多,並且對程式**來說可以做到透明的。如果是用其他分表方式就比分區麻煩了。 

b),分割槽實現是比較簡單的,在表結構中加入partition。建立分割槽表,根建平常的表沒什麼區別,並且對開**端來說是透明的。 

mysql分表和分割槽有什麼聯絡呢 

1,都能提高mysql的性高,在高併發狀態下都有乙個良好的表面。 

2,分表和分割槽不矛盾,可以相互配合的,對於那些大訪問量,並且表資料比較多的表,我們可以採取分表和分割槽結合的方式(如果merge這種分表方式,不能和分割槽配合的話,可以用其他的分表試),訪問量不大,但是表資料很多的表,我們可以採取分割槽的方式等。

分庫分表區別:

1 基本思想之什麼是分庫分表?

從字面上簡單理解,就是把原本儲存於乙個庫的資料分塊儲存到多個庫上,把原本儲存於乙個表的資料分塊儲存到多個表上。

2 基本思想之為什麼要分庫分表?

資料庫中的資料量不一定是可控的,在未進行分庫分表的情況下,隨著時間和業務的發展,庫中的表會越來越多,表中的資料量也會越來越大,相應地,資料操作,增刪改查的開銷也會越來越大;另外,一台伺服器的資源(cpu、磁碟、記憶體、io等)是有限的,最終資料庫所能承載的資料量、資料處理能力都將遭遇瓶頸,。

3 分庫分表的實施策略。

如果你的單機效能很低了,那可以嘗試分庫。分庫,業務透明,在物理實現上分成多個伺服器,不同的分庫在不同伺服器上。分割槽可以把表分到不同的硬碟上,但不能分配到不同伺服器上。一台機器的效能是有限制的,用分庫可以解決單台伺服器效能不夠,或者成本過高問題。

當分割槽之後,表還是很大,處理不過來,這時候可以用分庫。

orderid,userid,ordertime,.....

userid%4=0,用分庫1

userid%4=1,用分庫2

userid%4=2, 用分庫3

userid%4=3,用分庫4

上面這個就是乙個簡單的分庫路由,根據userid選擇分庫,即不同的伺服器

分庫分表有垂直切分和水平切分兩種。

3.1 何謂垂直切分,即將表按照功能模組、關係密切程度劃分出來,部署到不同的庫上。例如,我們會建立定義資料庫workdb、商品資料庫paydb、使用者資料庫userdb、日誌資料庫logdb等,分別用於儲存專案資料定義表、商品定義表、使用者資料表、日誌資料表等。

如userid,name,addr乙個表,為了防止表過大,分成2個表。

userid,name

userid,addr

3.2 何謂水平切分,當乙個表中的資料量過大時,我們可以把該錶的資料按照某種規則,例如userid雜湊、按性別、按省,進行劃分,然後儲存到多個結構相同的表,和不同的庫上。例如,我們的userdb中的使用者資料表中,每乙個表的資料量都很大,就可以把userdb切分為結構相同的多個userdb:part0db、part1db等,再將userdb上的使用者資料表usertable,切分為很多usertable:usertable0、usertable1等,然後將這些表按照一定的規則儲存到多個userdb上。

3.3 應該使用哪一種方式來實施資料庫分庫分表,這要看資料庫中資料量的瓶頸所在,並綜合專案的業務型別進行考慮。

如果資料庫是因為表太多而造成海量資料,並且專案的各項業務邏輯劃分清晰、低耦合,那麼規則簡單明瞭、容易實施的垂直切分必是首選。

而如果資料庫中的表並不多,但單錶的資料量很大、或資料熱度很高,這種情況之下就應該選擇水平切分,水平切分比垂直切分要複雜一些,它將原本邏輯上屬於一體的資料進行了物理分割,除了在分割時要對分割的粒度做好評估,考慮資料平均和負載平均,後期也將對專案人員及應用程式產生額外的資料管理負擔。

在現實專案中,往往是這兩種情況兼而有之,這就需要做出權衡,甚至既需要垂直切分,又需要水平切分。我們的遊戲專案便綜合使用了垂直與水平切分,我們首先對資料庫進行垂直切分,然後,再針對一部分表,通常是使用者資料表,進行水平切分。

4 分庫分表存在的問題。

4.1 事務問題。

在執行分庫分表之後,由於資料儲存到了不同的庫上,資料庫事務管理出現了困難。如果依賴資料庫本身的分布式事務管理功能去執行事務,將付出高昂的效能代價;如果由應用程式去協助控制,形成程式邏輯上的事務,又會造成程式設計方面的負擔。

4.2 跨庫跨表的join問題。

在執行了分庫分表之後,難以避免會將原本邏輯關聯性很強的資料劃分到不同的表、不同的庫上,這時,表的關聯操作將受到限制,我們無法join位於不同分庫的表,也無法join分表粒度不同的表,結果原本一次查詢能夠完成的業務,可能需要多次查詢才能完成。

4.3 額外的資料管理負擔和資料運算壓力。

額外的資料管理負擔,最顯而易見的就是資料的定位問題和資料的增刪改查的重複執行問題,這些都可以通過應用程式解決,但必然引起額外的邏輯運算,例如,對於乙個記錄使用者成績的使用者資料表usertable,業務要求查出成績最好的100位,在進行分表之前,只需乙個order by語句就可以搞定,但是在進行分表之後,將需要n個order by語句,分別查出每乙個分表的前100名使用者資料,然後再對這些資料進行合併計算,才能得出結果。

**:

Mysql分表和分割槽的區別

一,什麼是mysql分表,分割槽 什麼是分表,從表面意思上看呢,就是把一張表分成n多個小表,具體請看mysql分表的3種方法 什麼是分割槽,分割槽呢就是把一張表的資料分成n多個區塊,這些區塊可以在同乙個磁碟上,也可以在不同的磁碟上,具體請參考mysql分割槽功能詳細介紹,以及例項 二,mysql分表...

Hive分通表和分割槽表的區別

把錶或分割槽劃分成bucket有兩個理由 1,更快,桶為表加上額外結構,鏈結相同列劃分了桶的表,可以使用map side join更加高效。2,取樣sampling更高效。沒有分割槽的話需要掃瞄整個資料集。3.與分割槽不同的是,分割槽依據的不是真實資料表檔案中的列,而是我們指定的偽列,但是分桶是依據...

分割槽和分表

垂直分表 垂直分表在日常開發和設計中比較常見,通俗的說法叫做 大表拆小表 拆分是基於關係型資料庫中的 列 字段 進行的。通常情況,某個表中的字段比較多,可以新建立一張 擴充套件表 將不經常使用或者長度較大的字段拆分出去放到 擴充套件表 中,如下圖所示 小結在字段很多的情況下,拆分開確實更便於開發和維...