前奏
因为在分表的时候我们需要知道我们分的是第几个表,所以我们先需要初始化我们的分表号
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);
|
文章转载来自:ttlsa.com