MySQL5.5表的水平拆分





一:業務背景

二:第一種業務水平拆分方案

三:第二種業務水平拆分方案




1.1由於業務量的急劇增加,某張表的數據越來越大,現在假設的情況爲某家公司的P2P網站,由於前期宣傳比較好,在近三個月的時間裏業務量急劇增加,使得流水記錄表(trade)的數據量變的越來越大,已經超過300萬行記錄,預計年內流水錶的記錄可能會超過1000萬行,這個時候就需要考慮做表的水平拆分了



1.2 假設隨着業務量的增加,用戶量也增加了,由以前的幾千個用戶上升到100萬,也想對其進行水平拆分

 

 

2.1假設年內達到1000萬行記錄,再加上後續的考慮,暫且把流水錶(trade)拆分爲10張表,分別爲trade_0, trade_1, trade_2, trade_3... , trade_10

 

 

2.2流水錶中的字段假設如下字段

serial_number流水號 user_ID用戶ID request_message請求信息

 

 

2.3因爲獲取流水是根據user_id(用戶ID)來獲取自己的流水情況的,所以這裏以user_id來做分表

 

 

2.4 user_id%10用user_id模上10,等於幾就把等於這個user_id的記錄插入到trade_x中(x等於0到10)

 

 

2.5具體步驟

2.5.1先查看一下當前trade表中有多少條記錄,以便最後拆分完成以後覈對記錄是否丟失

wKiom1WlI53SoaqDAABzowiB6B0755.jpg




2.5.2把user_id%10=0的記錄插入到trade_0,trade_1...trade_9表中

wKiom1WlI8Hiw8xoAAB3Vx-r6-E977.jpg

wKioL1WlJZriMt3-AAB96mtyJrg473.jpg

wKioL1WlJZqx2BGQAACFRWU0yAk806.jpg

wKiom1WlI8GjXl1VAACHoUaoeSQ508.jpg

wKiom1WlI8GQAnWMAACIFiXUWK0840.jpg

wKioL1WlJaywibY1AACH-dBNs70572.jpg

wKiom1WlI9OQVIhTAACA04I7mMc785.jpg

wKioL1WlJaziBzNrAACNK2Q1YtA224.jpg

wKiom1WlI9OjzXtDAACHzYuxw5w086.jpg

wKioL1WlJayxRkbbAACJmNuMg6Y491.jpg





2.5.3把trade_0...trade_10表的記錄加起來,看是否是trade表的總記錄數

 

 

 

2.5.4以上是把已有的數據拆分成多張表了,那麼查詢和插入如何操作呢?因爲流水是和用戶的操作相關的,所以查詢和插入的時候,可以使用拼接字符串的方式進行插入數據,例如上面的拆分方法就可以這樣拼接

int suffix = user_id%10;

String table_name = "trade_" + suffix;

INSERT INTO table_name(...) values(...);

或者

SELECT * FROM table_name WHERE ...;


 

 

2.5.5總結,由於以上拆分的表是根據已有的用戶ID進行拆分的,先有用戶,再有流水記錄,所以這種業務做拆分是比較容易的

 

 

 

3.1由於用戶量的增長,對用戶表也要做數據拆分,拆分方案和以上相同,拆分爲user_main_0...user_main_5

wKioL1WlJguATu0ZAAGzUA2SjxQ421.jpg





3.2現在的問題是,用戶插入的時候,我們不知道用戶ID是多少,也就意味着不知道應該往user_main_0...user_main_5那張表中插入數據

 

 

 

3.3爲了解決以上問題我們可以先執行一下SQL語句

mysql> SELECT AUTO_INCREMENT FROMinformation_schema.TABLES WHERE TABLE_NAME='user_main';

它返回的是當前表的下一個自增長ID的值

 

 

 

3.4通過以上SQL語句已經得到了當前user_main表下一個ID值,下面創建user_main_uuid表

mysql> CREATE TABLEuser_main_uuid(user_main_next_id INT UNSIGNED PRIMARY KEY AUTO_INCREMENT);


 


3.5然後把“3.3 SQL語句”返回的值插入到user_main_uuid中

wKiom1WlJJagVUE_AABxd4J9l8U280.jpg




3.6那麼用戶註冊的時候,提交用戶填寫的信息,進入到controll的時候,校驗完用戶信息以後,首先先查user_main_uuid表的user_mian_next_id字段返回的值,然後根據這個值%5,等於幾,就給user_main_x中插入

 

 

 

3.7還有一個問題,用戶註冊完成之後,應該把user_main_next_id的值自動加1,否則,下個用戶註冊的時候ID會重複導致不能成功插入數據,所以在把數據成功插入到對應的user_main_x表中以後,再執行以下SQL語句

mysql> INSERT INTO user_main_uuidVALUES(NULL);

wKiom1WlJMLDs7ceAADgmukbMNg783.jpg

由於插入一條記錄的方式來使ID自增的,所以“3.6”中應該獲取的是user_mian_next_id字段的最大值MAX(user_mian_next_id)




3.8除了以上更新user_mian_next_id的值以外,還可以是以下方式

wKioL1WlJs3DXZ3EAAEQBoTqz8U690.jpg

這樣user_main_uuid表中就永遠只有一條記錄,就不用使用MAX()函數了





發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章