天天看點

關于MySQL分庫分表--簡單想法

本文轉自 位鵬飛 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

        感謝總監的幫助!