本文轉自 位鵬飛 51CTO部落格,原文連結:http://blog.51cto.com/weipengfei/1333460,如需轉載請自行聯系原作者為提高業務響應時間,避免OS處理過大的檔案,修改MySQL表結構應用更順暢,分庫分表是最好的選擇;大緻的兩個思路是:
1、資料表容量一定,表的個數不限;
2、資料表的個數一定,容量遞增;
針對表容量一定,有以下思路:稱之為step方式:
按照splitField取整存放:databasesize 代表該資料庫總記錄行數,tablesize 代表 表的記錄數
例如一個資料表裡最多100萬條記錄,每個資料庫最多放10個表。則databaseSize=1000萬。tableSize=100萬.
假定splitField=N時,則該記錄在dbPrefix + (int)Math.ceil((N/(databaseSize*1.0)))資料庫
資料表為 tbPrefix + (int)Math.ceil((N/(tableSize*1.0)))
則資料庫的編号從1開始,db1,db2,....,dbN(N根據splitField的無限增大而動态擴張)
db1裡面的表為tb1,tb2,...,tb10
db2裡面的表為tb11,tb12,...,tb20.
db10裡面的表為tb91,tb92,...,tb100.
這樣已經做好擴充,每個表的容量一定,表的個數不限,比較适合QQ群的方式,也不存在資料冷熱問題;
按照以上的方式,對于像視訊評論,或者微網誌評論來說 就容易出現 通路沒有實作負載均衡,易出現太多的熱點;
用取模mode方式還是比較合适的:
下面讨論下标的個數一定,容量遞增;取模是最好的負載均衡,針對熱門評論,可以實作很好的負載均衡;
其實這個大家一看是有一個明顯問題的,就是擴容時需要遷移資料的;是以規定表的個數是很關鍵的;
splitType=mode時,資料庫的數量恒定為databaseSize,每個庫的表的數量恒定為tableSize張表,按照splitField取模存放
假定splitField=N時,則該記錄在dbPrefix + (N%databaseSize)資料庫
資料表為 tbPrefix + N%(tableSize*databaseSize)
例如分拆4個庫,每個資料庫裡四張表。則資料庫編号從0開始,db0,db1,db2,db3
db0裡面的資料表為db0,db4,db8,db12
db1裡面的資料表為db1,db5,db9,db13
db2裡面的資料表為db2,db6,db10,db14
db3裡面的資料表為db3,db7,db11,db15
感謝總監的幫助!