单库单表
第一步:修改conf/server.yaml
authentication:
users:
root:
password: root
sharding:
password: sharding
authorizedSchemas: test
props:
max.connections.size.per.query: 1
acceptor.size: 16 # 用于设置接收客户端请求的工作线程个数,默认为CPU核数*2
executor.size: 16 # 工作线程数量,默认值: CPU核数
proxy.frontend.flush.threshold: 128 # The default value is 128.
# LOCAL: Proxy will run with LOCAL transaction.
# XA: Proxy will run with XA transaction.
# BASE: Proxy will run with B.A.S.E transaction.
proxy.transaction.type: LOCAL
proxy.opentracing.enabled: false # 是否开启事务, 目前仅支持XA事务,默认为不开启
proxy.opentracing.enabled: false # 是否开启链路追踪功能,默认为不开启
query.with.cipher.column: true
sql.show: true # 是否开启SQL显示,默认值: false
第二步:修改conf/config-sharding.yaml
schemaName: test # 逻辑库名称
dataSources:
ds_0:
url: jdbc:mysql://127.0.0.1:3306/demo_ds_0?serverTimezone=UTC&useSSL=false
username: root # demo_ds_0数据库的账号
password: 123123 # demo_ds_0数据库的账号对应的密码
connectionTimeoutMilliseconds: 30000
idleTimeoutMilliseconds: 60000
maxLifetimeMilliseconds: 1800000
maxPoolSize: 50
shardingRule:
tables:
t_order:
actualDataNodes: ds_${0}.t_order_${0..1}
tableStrategy:
inline:
shardingColumn: order_id # 分表字段
algorithmExpression: t_order_${order_id % 2}
keyGenerator:
type: SNOWFLAKE
column: order_id
bindingTables:
- t_order
defaultDatabaseStrategy:
inline:
shardingColumn: user_id # 分库字段
algorithmExpression: ds_${0}
defaultTableStrategy:
none:
解释::
actualDataNodes: ds_${0}.t_order_${0..1}
:会在demo_ds_0
这个数据库中创建二张表:t_order_0和t_order_1
。algorithmExpression: t_order_${order_id % 2}
:分表,主要是把添加的数据放入到哪张表中。这里采用取模的方式进行分表。在这里要 注意一下 :order_id
必须是整数,不能是字符串,如果是字符串的数字的话,可以通过如下进行转换:Integer.parseInt(order_id)
algorithmExpression: ds_${0}
: 分库,因为这里是单库,所以这里不采用任何的方式进行分库。
第三步:启动sharding-proxy
- windows系统下运行:
bin/start.bat
- linux系统执行:
bin/start.sh
- 默认的端口是:
3307
第四步:创建相应的表
sharding-proxy启动成功之后,进行cmd命令行界面,输入如下信息:
mysql -uroot -P3307 -p
然后就是输入你在配置conf/server.yaml
文件中的users
中的root
里的password
密码了。
然后使用:show databases;
查看当前有什么逻辑库。
上图的逻辑库是:conf/server.yaml
中的authorizedSchemas
所对应的test
。
然后再执行:use test;
你可以执行:show tables;
查看当前库有没有表。
下面创建对应的表:
CREATE TABLE `t_order` (
`order_id` bigint(20) NOT NULL AUTO_INCREMENT,
`user_id` int(11) NOT NULL,
`status` varchar(50) COLLATE utf8_bin DEFAULT NULL,
PRIMARY KEY (`order_id`)
) ENGINE=InnoDB AUTO_INCREMENT=279205305122816001 DEFAULT CHARSET=utf8 COLLATE=utf8_bin;
上面的表结构字段比较少,你可以根据自己的需求来进行添加。
最后一步:测试
往刚刚创建的表添加一些测试数据:
insert into t_order(order_id,user_id,status) value(1,2,'22');
上面的数据会放入到t_order_0
表还是t_order_1
表呢?
在配置conf/config-sharding.yaml
文件时,里面的分表结构是这样的:algorithmExpression: t_order_${order_id % 2}
,可以看出是通过添加数据的order_id
取模 2 进行划分表的。那这样的话,上面添加的数据可以得出:order_id = 1
取模 2 之后是 1 ,所以上面添加的数据是放入到了t_order_1
这张表中。
再来一次试一下:
insert into t_order(order_id,user_id,status) value(2,2,'22');
这条order_id
取模 2 之后是 0,所以该数据放在t_order_0
这张表中。
单库单表扩展
上面采用分表是分成两张表,假设我们有100万的数据量,如果你采用的mysql
数据库的话,当数据表中数据量越大了,会影响到你查询出来的语句很慢。而我们上述分成了两张表,100万的数据量,每张表分得50万的数据。这样子总比一张表好是吧。
那怎么样分成更多的表呢?
分成十张表
分成十张表的规则就是:
修改conf/config-sharding.yaml
:
shardingRule:
tables:
t_order:
actualDataNodes: ds_${0}.t_order_${0..9}
tableStrategy:
inline:
shardingColumn: order_id # 分表字段
algorithmExpression: t_order_${order_id % 10}
keyGenerator:
type: SNOWFLAKE
column: order_id
这里主要是使用order_id
的尾数进行划分表。
我目前能想到的就是十张表,你如果能使用单库划分十张以上的表的话,可以跟我说一下,谢谢。
多库单表
第一步:修改conf/server.yaml
authentication:
users:
root:
password: root
sharding:
password: sharding
authorizedSchemas: test
props:
max.connections.size.per.query: 1
acceptor.size: 16 # 用于设置接收客户端请求的工作线程个数,默认为CPU核数*2
executor.size: 16 # 工作线程数量,默认值: CPU核数
proxy.frontend.flush.threshold: 128 # The default value is 128.
# LOCAL: Proxy will run with LOCAL transaction.
# XA: Proxy will run with XA transaction.
# BASE: Proxy will run with B.A.S.E transaction.
proxy.transaction.type: LOCAL
proxy.opentracing.enabled: false # 是否开启事务, 目前仅支持XA事务,默认为不开启
proxy.opentracing.enabled: false # 是否开启链路追踪功能,默认为不开启
query.with.cipher.column: true
sql.show: true # 是否开启SQL显示,默认值: false
第二步:修改conf/config-sharding.yaml
schemaName: test
dataSources:
ds_0:
url: jdbc:mysql://127.0.0.1:3306/demo_ds_0?serverTimezone=UTC&useSSL=false
username: root
password: 123123
connectionTimeoutMilliseconds: 30000
idleTimeoutMilliseconds: 60000
maxLifetimeMilliseconds: 1800000
maxPoolSize: 50
ds_1:
url: jdbc:mysql://127.0.0.1:3306/demo_ds_1?serverTimezone=UTC&useSSL=false
username: root
password: 123123
connectionTimeoutMilliseconds: 30000
idleTimeoutMilliseconds: 60000
maxLifetimeMilliseconds: 1800000
maxPoolSize: 50
shardingRule:
tables:
tasklist:
actualDataNodes: ds_${0..1}.tasklist_${0..9}
tableStrategy:
inline:
shardingColumn: id
algorithmExpression: tasklist_${id % 10}
keyGenerator:
type: SNOWFLAKE
column: id
bindingTables:
- tasklist
defaultDatabaseStrategy:
inline:
shardingColumn: sucaiid
algorithmExpression: ds_${Integer.parseInt(sucaiid) % 2}
defaultTableStrategy:
none:
自行在3306
端口的mysql
中创建好demo_ds_0
和demo_ds_1
两个数据库。
第三步:启动sharding-proxy
- windows系统下运行:
bin/start.bat
- linux系统执行:
bin/start.sh
- 默认的端口是:
3307
第四步:创建相应的表
sharding-proxy启动成功之后,进行cmd命令行界面,输入如下信息:
mysql -uroot -P3307 -p
然后就是输入你在配置conf/server.yaml
文件中的users
中的root
里的password
密码了。
然后使用:show databases;
查看当前有什么逻辑库。
上图的逻辑库是:conf/server.yaml
中的authorizedSchemas
所对应的test
。
然后再执行:use test;
你可以执行:show tables;
查看当前库有没有表。
下面创建对应的表:
CREATE TABLE `tasklist` (
`id` bigint(20) NOT NULL AUTO_INCREMENT,
`user_id` int(11) NOT NULL,
`sucaiid` varchar(60) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=279205305122816001 DEFAULT CHARSET=utf8 COLLATE=utf8_bin;
上面的表结构字段比较少,你可以根据自己的需求来进行添加。
最后一步:测试
往刚刚创建的表添加一些测试数据:
insert into t_order(id,user_id,sucaiid) value(2,21,'22');
该数据存放在:demo_ds_1
数据库中的tasklist_2
数据表中。
介绍
上面的多库多表:双库双表,每个库中划分十张表。首先是根据sucaiid
划分库,然后再根据id
划分表。表的数据结构是一样的