一、什么是mysql分表,分區(qū)
什么是分表,從表面意思上看呢,就是把一張表分成N多個小表
什么是分區(qū),分區(qū)呢就是把一張表的數(shù)據(jù)分成N多個區(qū)塊,這些區(qū)塊可以在同一個磁盤上,也可以在不同的磁盤上
二、mysql分表和分區(qū)有什么區(qū)別呢
1、實現(xiàn)方式上
- mysql的分表是真正的分表,一張表分成很多表后,每一個小表都是完整的一張表,都對應(yīng)三個文件,一個.MYD數(shù)據(jù)文件,.MYI索引文件,.frm表結(jié)構(gòu)
- 分區(qū)不一樣,一張大表進行分區(qū)后,他還是一張表,不會變成二張表,但是他存放數(shù)據(jù)的區(qū)塊變多了。
2、提高性能上
- 分表重點是存取數(shù)據(jù)時,如何提高mysql并發(fā)能力上;
- 而分區(qū)呢,如何突破磁盤的讀寫能力,從而達到提高mysql性能的目的。
3、實現(xiàn)的難易度上
1、分表的方法有很多,用merge來分表,是最簡單的一種方式。這種方式根分區(qū)難易度差不多,并且對程序代碼來說可以做到透明的。如果是用其他分表方式就比分區(qū)麻煩了。
2、分區(qū)實現(xiàn)是比較簡單的,建立分區(qū)表,根建平常的表沒什么區(qū)別,并且對開代碼端來說是透明的。
三、mysql分表和分區(qū)有什么聯(lián)系呢
1,都能提高mysql的性高,在高并發(fā)狀態(tài)下都有一個良好的表面。
2,分表和分區(qū)不矛盾,可以相互配合的,對于那些大訪問量,并且表數(shù)據(jù)比較多的表,我們可以采取分表和分區(qū)結(jié)合的方式(如果merge這種分表方式,不能和分區(qū)配合的話,可以用其他的分表試),訪問量不大,但是表數(shù)據(jù)很多的表,我們可以采取分區(qū)的方式等。
四、 分庫分表存在的問題。
1、事務(wù)問題。
在執(zhí)行分庫分表之后,由于數(shù)據(jù)存儲到了不同的庫上,數(shù)據(jù)庫事務(wù)管理出現(xiàn)了困難。如果依賴數(shù)據(jù)庫本身的分布式事務(wù)管理功能去執(zhí)行事務(wù),將付出高昂的性能代價;如果由應(yīng)用程序去協(xié)助控制,形成程序邏輯上的事務(wù),又會造成編程方面的負擔。
2、跨庫跨表的join問題。
在執(zhí)行了分庫分表之后,難以避免會將原本邏輯關(guān)聯(lián)性很強的數(shù)據(jù)劃分到不同的表、不同的庫上,這時,表的關(guān)聯(lián)操作將受到限制,我們無法join位于不同分庫的表,也無法join分表粒度不同的表,結(jié)果原本一次查詢能夠完成的業(yè)務(wù),可能需要多次查詢才能完成。
3、額外的數(shù)據(jù)管理負擔和數(shù)據(jù)運算壓力。
額外的數(shù)據(jù)管理負擔,最顯而易見的就是數(shù)據(jù)的定位問題和數(shù)據(jù)的增刪改查的重復執(zhí)行問題,這些都可以通過應(yīng)用程序解決,但必然引起額外的邏輯運算,例如,對于一個記錄用戶成績的用戶數(shù)據(jù)表userTable,業(yè)務(wù)要求查出成績最好的100位,在進行分表之前,只需一個order by語句就可以搞定,但是在進行分表之后,將需要n個order by語句,分別查出每一個分表的前100名用戶數(shù)據(jù),然后再對這些數(shù)據(jù)進行合并計算,才能得出結(jié)果。