任务1:实现ER表+多表联查
任务条件:
两个表 产品表 product 和 产品分类表 type
create table product(
id int unsigned primary key auto_increment,
name varchar(255),
price decimal(10,2),
type_id int # 商品分类类型
)engine=innodb;
create table type(
id int unsigned primary key auto_increment,
type_name varchar(255)
)engine=innodb;
1.要求在product中type_id和type表中的id相同的数据要放在同一个分片节点中以避免跨分区关联查询。
2.使用3个分片节点,3个分片节点在一台主机上。
3.使用取模算法切分。
----------------------
A. 配置schema.xml
# 上面dataHost的配置中,设置balance="0" 不进行读写分离,是因为只有一台主机hostM2,所以读不读写分离无所谓。
switchType="-1" 不自动切换,因为只有一台主机
writeType="0" 是指往第一台主机写,也是因为只有一台主机
B. 配置server.xml,创建用户操作schema
C. 配置rule.xml
重启mycat
# 登录hostM2的mysql服务,创建db1~3数据库:(请先确保已设置表名忽略大小写)
# 本地登录mycat
# 创建product和type表
先往type插入数据
在往product插入数据
发现type_id和type的id相同的product与type数据都在同一个分片节点中。
其实对type的id设置使用取模算法是,会对product的type_id采取相同的取模算法,这样才保证了type_id和type的id相同的product与type数据在同一个分片节点中。
=================================================
任务2:实现全局表
任务条件:
还是上面两个表 产品表 product 和 产品分类表 type
1.product是大表;type是小表,只有固定的6种分类;要求对上面两张表进行合理切分,避免跨分区关联查询。
2.使用3个分片节点,3个分片节点在一台主机上。
3.使用分片枚举算法。
----------------------------------
由于type是小表,而且只有固定的6中分类,即数据不经常变换,所以可以对type表进行全局表设置。
以product表的type_id为分区字段
如下:
配置schema.xml
# 设置了type="global"的<table>标签无需设置rule算法
配置rule.xml
partition-hash-int2.txt 如下:
# type为1,4放到节点1,type为2,5放到节点2,type为3,6放到节点3
重启mycat
创建db1~3数据库,并插入几条数据:
# 创建6个分类
# 超出范围的type_id的数据会插入到第一个节点dn4
# 进行多表联查
虽然这里显示的是要查dn4,5,6这三个分片,其实只用查dn4这个分片就行。
因为尝试将 dn5,dn6 的type数据清空,执行select * from type t join product p on p.type_id=t.id where type_id=4;依旧可以查到数据。