前段時間參與了公司的一個項目,這個項目的特點是資料量、訪問量都比較大,考慮使用資料庫水平分表策略,Google了大半天,竟然沒有找到分表工具。於是自己寫了個資料庫水平分表工具,支援MS Sql Server和 MySQL,對MYSQL支援比較好。
下面介紹下分表工具的使用方法。
首先是設定資料庫連接介面
輸入串連名稱(也可以點擊右邊的選擇框,從之前儲存的串連中選擇),選擇資料庫類型(目前支援Mysql和Sql Server),輸入ip地址、資料庫名稱、使用者名稱、密碼後點擊測試連接,如果提示串連成功,說明設定正確。
點擊確定按鈕進入主介面:
執行分表操作時,必須要有主表,主表名稱可以手工輸入也可以通過點擊右邊的選擇框,然後在下拉式清單中選擇。分表格式可以自己定義,分表邏輯也可以自己定義,後面會具體介紹,例子中的分表邏輯是劃分為1000個分表,表名為4位16進位,也就是0000~03e7。操作類型有三種:1、建立分表;2、修改分表(比如說在所有的分表中添加欄位或刪除欄位);3、刪除分表。操作類型選擇後DDL會自動產生(可以根據需要適當修改)。
點擊確定,執行分表操作。
查看資料庫,分表shoppingcart_0000~shoppingcart_03e7已經產生成功。
自訂分表命名策略
通過實現INameStrategy介面的GetTableNumbers方法來自訂分表尾碼名稱
public interface INameStrategy { string[] GetTableNumbers(); }
比如:
public class NameStrategy : INameStrategy { private readonly int _startIndex; private readonly int _endIndex; private readonly int _toBase; private readonly int _totalWidth; public NameStrategy(int startIndex, int endIndex, int toBase, int totalWidth) { _startIndex = startIndex; _endIndex = endIndex; _toBase = toBase; _totalWidth = totalWidth; } public string[] GetTableNumbers() { List<string> tableNames = new List<string>(); for (int i = _startIndex; i <= _endIndex; i++) { tableNames.Add(Convert.ToString(i, _toBase).PadLeft(_totalWidth, '0')); } return tableNames.ToArray(); } }
然後在unity.config中註冊自訂的命名策略實現
<register type="DBShardTools.Core.INameStrategy, DBShardTools.Core" mapTo="DBShardTools.Core.NameStrategy, DBShardTools.Core"> <constructor> <param name="startIndex" value="0" /> <param name="endIndex" value="999" /> <param name="toBase" value="16" /> <param name="totalWidth" value="4" /> </constructor> <lifetime type="singleton"/> </register>
該分表工具目前對MySql支援比較好,比如可以自動產生建立分表的DDL,Sql Server資料庫要自己將建表的指令碼貼到DDL文字框中。
代碼下載