- A+
所属分类:MySQL
前奏
因为在分表的时候我们需要知道我们分的是第几个表,所以我们先需要初始化我们的分表号
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 |
-- 创建一个系统信息表为了记录下当前最大的分表号 DROP TABLE system_setting; CREATE TABLE system_setting( system_setting_id INT unsigned NOT NULL AUTO_INCREMENT COMMENT '系统设置表ID', name VARCHAR(45) NOT NULL COMMENT '系统设置项目名', value VARCHAR(45) NOT NULL COMMENT '系统设置值', PRIMARY KEY(system_setting_id) ); -- 初始化当前最大分表号 INSERT INTO system_setting VALUES(NULL, 'max_sharding_table_num', 1); -- 指定需要有哪些表需要分,为了下面分表时进行锁表 INSERT INTO system_setting VALUES(NULL, 'sharding_table', 'sell_order'); INSERT INTO system_setting VALUES(NULL, 'sharding_table', 'buy_order'); INSERT INTO system_setting VALUES(NULL, 'sharding_table', 'goods'); INSERT INTO system_setting VALUES(NULL, 'sharding_table', 'order_goods'); -- 需要分表的表是通过什么字段来分表的 INSERT INTO system_setting VALUES(NULL, 'sharding_sell_order_by', 'user_guide_id'); INSERT INTO system_setting VALUES(NULL, 'sharding_buy_order_by', 'user_id'); INSERT INTO system_setting VALUES(NULL, 'sharding_goods_by', 'store_id'); INSERT INTO system_setting VALUES(NULL, 'sharding_order_goods_by', 'user_guide_id'); -- 普通用户需要分那张表 INSERT INTO system_setting VALUES(NULL, 'normal_user_sharding', 'buy_order'); -- 导购需要分的表 INSERT INTO system_setting VALUES(NULL, 'user_guide_sharding', 'buy_order'); INSERT INTO system_setting VALUES(NULL, 'user_guide_sharding', 'sell_order'); INSERT INTO system_setting VALUES(NULL, 'user_guide_sharding', 'order_goods'); -- 店主需要分哪些表 INSERT INTO system_setting VALUES(NULL, 'store_owner_sharding', 'buy_order'); INSERT INTO system_setting VALUES(NULL, 'store_owner_sharding', 'sell_order'); INSERT INTO system_setting VALUES(NULL, 'store_owner_sharding', 'order_goods'); INSERT INTO system_setting VALUES(NULL, 'store_owner_sharding', 'goods'); |
我们的目标
1、我们的目标是实现能手动指定创建多少张表,并且能手动指定哪些用户到哪些表中。
2、最终能通过一定的算法,自动化这些分表迁移数据的工作。
在这里我们来实现 '1' 手动指定, 以下可能比较枯燥都是代码了, 一般只要看主逻辑有一个思路,代码自己玩转它 ^_^
程序流程图
代码主逻辑展示
在附件中有完整的代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
if __name__=='__main__': # 设置默认的数据库链接参数 db_config = { 'user' : 'root', 'password': 'root', 'host' : '127.0.0.1', 'port' : 3306, 'database': 'test' } sharding = ShardingTable() # 设置数据库配置 sharding.set_db_config(db_config) # 初始化游标 sharding.get_conn_cursor() # 提供需要分表的个数,创建分表 sharding.create_tables(9) # 指定用户迁移数据到指定表 sharding.move_data('username1', 2) sharding.move_data('username6', 6) sharding.move_data('username66', 9) |
上面我们指定新分9个表,并且迁移 'username1-店主'、'username6-导购'、'username66-普通用户' 的数据到指定分表
完整的python代码:sharding_table.py MySQL分库分表(4)-脚本
查看迁移后的数据
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
-- 查看迁移后的数据-购买订单表 SELECT * FROM buy_order_2 LIMIT 0, 1; SELECT * FROM buy_order_6 LIMIT 0, 1; SELECT * FROM buy_order_9 LIMIT 0, 1; -- 查看迁移后的数据-商品表 SELECT * FROM goods_2 LIMIT 0, 1; SELECT * FROM goods_6 LIMIT 0, 1; SELECT * FROM goods_9 LIMIT 0, 1; -- 查看迁移后的数据-出售订单表 SELECT * FROM sell_order_2 LIMIT 0, 1; SELECT * FROM sell_order_6 LIMIT 0, 1; SELECT * FROM sell_order_9 LIMIT 0, 1; -- 查看迁移后的数据-订单商品表 SELECT * FROM order_goods_2 LIMIT 0, 1; SELECT * FROM order_goods_6 LIMIT 0, 1; SELECT * FROM order_goods_9 LIMIT 0, 1; -- 查看用户数据分布在哪个分表 table_flag SELECT * FROM user WHERE user_id IN(1, 6, 66); |
若有疑问,请跟帖说明。
感觉本文内容不错,读后有收获?

微信公众号
扫一扫关注运维生存时间公众号,获取最新技术文章~