MySQL分库分表分库准备(6th)
前言
隨著業務的發展單庫中的分表的數量越來越多, 使用在單庫上存放過多的表這樣是不合理的。因此,我們就需要考慮將數據根據數據庫進行拆分。
一般mysql不建議表的數量超過1000個。當然,這不能一概而論,還需要根據你的數據量,和硬件來確定然后根據自己的服務器調整幾個mysql '%open%' 參數,從而來確定你的庫應該不超過幾張表性能能在可接受范圍內。
分庫思路
在分庫前我們需要確定一下我們應該如何去分庫:
1、我們是根據用戶ID來進行分庫,和分表的思路一樣。
2、我們需要在用戶表中標記一下用戶的數據是在哪個庫。
3、在系統設置表中應該記錄下當前最大分庫數量。
4、在系統設置表中應該記錄現在所有分庫的庫名。
5、在系統設置表中應該記錄每個分庫的數據庫連接描述符信息。
分庫規則
我們以 '數字' 為分庫標識最終分庫的名稱如:test_1、test_2、test_3 ...
在新增加庫的時候,我們在新庫中創建的表的數量是在系統設置表中的最大分表數。如在系統設置表中 name='max_sharding_table_num' 的 value='10',這時我們會初始化每個分表的個數為10個。
數據遷移
和分表一樣我們應該很清楚哪些表是需要進行分庫,我們需要分庫的表有 buy_order_n、goods_n、sell_order_n、order_goods_n。
我們應該將之前的數據的庫名進行統一。如之前test庫的數據要先遷移到 test_1 上
提醒:數據遷移慎重,不是說遷移就遷移的。其實也可以不用遷移的,如果不遷移之后的自動分庫的代碼就需要做多一點的判斷。這為了統一我就做了遷移。
數據遷移SQL
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 | --?創建新庫 CREATE?DATABASE?test_1; use?test; --?拼出需要創建的表 SELECT?CONCAT('CREATE?TABLE?test_1.', ??TABLE_NAME, ??'?LIKE?', ??TABLE_SCHEMA,?'.',?TABLE_NAME,?';' )?????????????? FROM?information_schema.tables WHERE?TABLE_SCHEMA?=?'test'; --?創建表這邊我們不遷移公用的表:user、store、user_guide、system_setting CREATE?TABLE?test_1.buy_order_1?LIKE?test.buy_order_1; CREATE?TABLE?test_1.buy_order_10?LIKE?test.buy_order_10; CREATE?TABLE?test_1.buy_order_2?LIKE?test.buy_order_2; CREATE?TABLE?test_1.buy_order_3?LIKE?test.buy_order_3; CREATE?TABLE?test_1.buy_order_4?LIKE?test.buy_order_4; CREATE?TABLE?test_1.buy_order_5?LIKE?test.buy_order_5; CREATE?TABLE?test_1.buy_order_6?LIKE?test.buy_order_6; CREATE?TABLE?test_1.buy_order_7?LIKE?test.buy_order_7; CREATE?TABLE?test_1.buy_order_8?LIKE?test.buy_order_8; CREATE?TABLE?test_1.buy_order_9?LIKE?test.buy_order_9; CREATE?TABLE?test_1.goods_1?LIKE?test.goods_1; CREATE?TABLE?test_1.goods_10?LIKE?test.goods_10; CREATE?TABLE?test_1.goods_2?LIKE?test.goods_2; CREATE?TABLE?test_1.goods_3?LIKE?test.goods_3; CREATE?TABLE?test_1.goods_4?LIKE?test.goods_4; CREATE?TABLE?test_1.goods_5?LIKE?test.goods_5; CREATE?TABLE?test_1.goods_6?LIKE?test.goods_6; CREATE?TABLE?test_1.goods_7?LIKE?test.goods_7; CREATE?TABLE?test_1.goods_8?LIKE?test.goods_8; CREATE?TABLE?test_1.goods_9?LIKE?test.goods_9; CREATE?TABLE?test_1.order_goods_1?LIKE?test.order_goods_1; CREATE?TABLE?test_1.order_goods_10?LIKE?test.order_goods_10; CREATE?TABLE?test_1.order_goods_2?LIKE?test.order_goods_2; CREATE?TABLE?test_1.order_goods_3?LIKE?test.order_goods_3; CREATE?TABLE?test_1.order_goods_4?LIKE?test.order_goods_4; CREATE?TABLE?test_1.order_goods_5?LIKE?test.order_goods_5; CREATE?TABLE?test_1.order_goods_6?LIKE?test.order_goods_6; CREATE?TABLE?test_1.order_goods_7?LIKE?test.order_goods_7; CREATE?TABLE?test_1.order_goods_8?LIKE?test.order_goods_8; CREATE?TABLE?test_1.order_goods_9?LIKE?test.order_goods_9; CREATE?TABLE?test_1.sell_order_1?LIKE?test.sell_order_1; CREATE?TABLE?test_1.sell_order_10?LIKE?test.sell_order_10; CREATE?TABLE?test_1.sell_order_2?LIKE?test.sell_order_2; CREATE?TABLE?test_1.sell_order_3?LIKE?test.sell_order_3; CREATE?TABLE?test_1.sell_order_4?LIKE?test.sell_order_4; CREATE?TABLE?test_1.sell_order_5?LIKE?test.sell_order_5; CREATE?TABLE?test_1.sell_order_6?LIKE?test.sell_order_6; CREATE?TABLE?test_1.sell_order_7?LIKE?test.sell_order_7; CREATE?TABLE?test_1.sell_order_8?LIKE?test.sell_order_8; CREATE?TABLE?test_1.sell_order_9?LIKE?test.sell_order_9; --?生成插入表的數據 SELECT?CONCAT('INSERT?INTO?', ??TABLE_SCHEMA,?'.',?TABLE_NAME, ??'?SELECT?*?FROM?test',?'.',?TABLE_NAME,?';' )?????????????? FROM?information_schema.tables WHERE?TABLE_SCHEMA?=?'test_1'; --?插入數據 INSERT?INTO?test_1.buy_order_1?SELECT?*?FROM?test.buy_order_1; INSERT?INTO?test_1.buy_order_10?SELECT?*?FROM?test.buy_order_10; INSERT?INTO?test_1.buy_order_2?SELECT?*?FROM?test.buy_order_2; INSERT?INTO?test_1.buy_order_3?SELECT?*?FROM?test.buy_order_3; INSERT?INTO?test_1.buy_order_4?SELECT?*?FROM?test.buy_order_4; INSERT?INTO?test_1.buy_order_5?SELECT?*?FROM?test.buy_order_5; INSERT?INTO?test_1.buy_order_6?SELECT?*?FROM?test.buy_order_6; INSERT?INTO?test_1.buy_order_7?SELECT?*?FROM?test.buy_order_7; INSERT?INTO?test_1.buy_order_8?SELECT?*?FROM?test.buy_order_8; INSERT?INTO?test_1.buy_order_9?SELECT?*?FROM?test.buy_order_9; INSERT?INTO?test_1.goods_1?SELECT?*?FROM?test.goods_1; INSERT?INTO?test_1.goods_10?SELECT?*?FROM?test.goods_10; INSERT?INTO?test_1.goods_2?SELECT?*?FROM?test.goods_2; INSERT?INTO?test_1.goods_3?SELECT?*?FROM?test.goods_3; INSERT?INTO?test_1.goods_4?SELECT?*?FROM?test.goods_4; INSERT?INTO?test_1.goods_5?SELECT?*?FROM?test.goods_5; INSERT?INTO?test_1.goods_6?SELECT?*?FROM?test.goods_6; INSERT?INTO?test_1.goods_7?SELECT?*?FROM?test.goods_7; INSERT?INTO?test_1.goods_8?SELECT?*?FROM?test.goods_8; INSERT?INTO?test_1.goods_9?SELECT?*?FROM?test.goods_9; INSERT?INTO?test_1.order_goods_1?SELECT?*?FROM?test.order_goods_1; INSERT?INTO?test_1.order_goods_10?SELECT?*?FROM?test.order_goods_10; INSERT?INTO?test_1.order_goods_2?SELECT?*?FROM?test.order_goods_2; INSERT?INTO?test_1.order_goods_3?SELECT?*?FROM?test.order_goods_3; INSERT?INTO?test_1.order_goods_4?SELECT?*?FROM?test.order_goods_4; INSERT?INTO?test_1.order_goods_5?SELECT?*?FROM?test.order_goods_5; INSERT?INTO?test_1.order_goods_6?SELECT?*?FROM?test.order_goods_6; INSERT?INTO?test_1.order_goods_7?SELECT?*?FROM?test.order_goods_7; INSERT?INTO?test_1.order_goods_8?SELECT?*?FROM?test.order_goods_8; INSERT?INTO?test_1.order_goods_9?SELECT?*?FROM?test.order_goods_9; INSERT?INTO?test_1.sell_order_1?SELECT?*?FROM?test.sell_order_1; INSERT?INTO?test_1.sell_order_10?SELECT?*?FROM?test.sell_order_10; INSERT?INTO?test_1.sell_order_2?SELECT?*?FROM?test.sell_order_2; INSERT?INTO?test_1.sell_order_3?SELECT?*?FROM?test.sell_order_3; INSERT?INTO?test_1.sell_order_4?SELECT?*?FROM?test.sell_order_4; INSERT?INTO?test_1.sell_order_5?SELECT?*?FROM?test.sell_order_5; INSERT?INTO?test_1.sell_order_6?SELECT?*?FROM?test.sell_order_6; INSERT?INTO?test_1.sell_order_7?SELECT?*?FROM?test.sell_order_7; INSERT?INTO?test_1.sell_order_8?SELECT?*?FROM?test.sell_order_8; INSERT?INTO?test_1.sell_order_9?SELECT?*?FROM?test.sell_order_9; ?? --?向系統表中添加當前最大分庫數量 INSERT?INTO?test.system_setting VALUES(NULL,?'max_sharding_database_num',?1); --?向系統表中添加分庫名前綴 INSERT?INTO?test.system_setting VALUES(NULL,?'sharding_database_prefix',?'test'); --?向系統表中添加當前有哪些分庫 INSERT?INTO?test.system_setting VALUES(NULL,?'sharding_database',?'test_1'); --?修改系統表字段類value型為varchar(120) ALTER?TABLE?test.system_setting MODIFY?`value`?varchar(120)?NOT?NULL?COMMENT?'系統設置值'; --?向系統表添加響應數據庫鏈接描述符 INSERT?INTO?test.system_setting VALUES(NULL,?'test_1',?'{"user":"root","password":"root","host":"127.0.0.1","port":3306,"database":"test_1"}'); ?? --?初始化用戶所在庫為test_1 ALTER?TABLE?user ADD?db_name?VARCHAR(45)?NOT?NULL?DEFAULT?'test_1' COMMENT?'用戶數據所在數據庫名'; |
文章出自:http://www.ttlsa.com/mysql/mysql-distributed-database-and-table-prepare/
? ? ? 本文轉自027ryan ?51CTO博客,原文鏈接:http://blog.51cto.com/ucode/1746032,如需轉載請自行聯系原作者
總結
以上是生活随笔為你收集整理的MySQL分库分表分库准备(6th)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 企业架构 - ADM方法概要介绍
- 下一篇: linux+nginx+mysql+ph