织梦如何做电商网站,seo网站建设优化,金山网站安全检测,建设网站有哪些步骤接上一篇#xff1a;企业实战_16_MyCat全局自增ID https://blog.csdn.net/weixin_40816738/article/details/100064315 案例比较#xff1a; 在垂直拆分场景中#xff0c;针对字段个数少的类型为字典类型的表#xff0c;我们可以使用全局表的方式解决。 在水平扩展场景中企业实战_16_MyCat全局自增ID https://blog.csdn.net/weixin_40816738/article/details/100064315 案例比较 在垂直拆分场景中针对字段个数少的类型为字典类型的表我们可以使用全局表的方式解决。 在水平扩展场景中针对数据量很大的表怎样实现跨分片查询呢 ER分片 文章目录一、跨分片查询的另一个场景1. 思考2. 回顾3. 目前归纳二、配置order_detail表的全局自增id一、跨分片查询的另一个场景
1. 思考
order_master表进行了切片操作而order_detail没有进行切片操作 2张表不在一个分片中现在这种关联属于跨分片关联针对这种跨分片的查询应该如何处理呢
2. 回顾
在垂直拆分场景中针对这种跨分片查询的情况有3种方式解决跨分片查询。
方式应用场景/说明api结果拼接比较耗时数据冗余数据冗余量大全局表字段少 字典类型的表
3. 目前归纳
在水平扩展场景针对这种跨分片查询的情况使用方式解决跨分片查询。
方式应用场景/说明ER分片字段多访问频繁数据集大
得出结论
全局表适用于字段少的字典类型的表的场景而order_master订单表是一个非常庞大的表调用比较频繁因此并不适合使用全局表的应用场景。
ER分片表是通过ER关系来进行分片的可以把需要两个关联的表根据他们的关联键把要关联的这些数据分布到同一个分片内那么我们在同一个分片内来解决这个关联问题,以此来解决跨分片查询的问题
mysql -uapp_imooc -p123456 -h192.168.92.101 -P8066mysql select * from order_master a join order_detail b on a.order_id b.order_id;
ERROR 1064 (HY000): invalid route in sql, multi tables found but datanode has no intersection sql:select * from order_master a join order_detail b on a.order_id b.order_id
mysql ER分片 #分别在order_db01、order_db02、order_db03、order_db04数据库中创建order_detail表 #登录node2节点在order_db01、order_db02数据库中创建order_detail表
[rootnode2 ~]# mysql -uroot -p123456
mysql use order_db01;
mysql use order_db02;
依次初始化创建表sql#登录node3节点在order_db03、order_db04数据库中创建order_detail表
[rootnode3 ~]# mysql -uroot -p123456
mysql use order_db03;
mysql use order_db04;
依次初始化创建表sql初始化创建表sql
CREATE TABLE order_detail (order_detail_id int(10) unsigned NOT NULL AUTO_INCREMENT COMMENT 自增主键ID,订单详情表ID,order_id int(10) unsigned NOT NULL COMMENT 订单表ID,product_id int(10) unsigned NOT NULL COMMENT 订单商品ID,product_name varchar(50) NOT NULL COMMENT 商品名称,product_cnt int(11) NOT NULL DEFAULT 1 COMMENT 购买商品数量,product_price decimal(8,2) NOT NULL COMMENT 购买商品单价,average_cost decimal(8,2) NOT NULL DEFAULT 0.00 COMMENT 平均成本价格,weight float DEFAULT NULL COMMENT 商品重量,fee_money decimal(8,2) NOT NULL DEFAULT 0.00 COMMENT 优惠分摊金额,w_id int(10) unsigned NOT NULL COMMENT 仓库ID,modified_time timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT 最后修改时间,PRIMARY KEY (order_detail_id)
) ENGINEInnoDB DEFAULT CHARSETutf8mb4 COMMENT订单详情表;数据清理
# 删除order_master的数据
mysql -uapp_imooc -p123456 -h192.168.92.101 -P8066
use imooc_db;
delete from order_master;添加分片配置 修改编辑schema.xml order_master在的table标签中添加childTable 标签并把下面以前定义的的order_detailtable标签删除
cd /app/mycat/conf/
vim schema.xmltable nameorder_master primaryKeyorder_id dataNodeordb01,ordb02,ordb03,ordb04 ruleorder_master autoIncrementtrue/
childTable nameorder_detail primaryKeyorder_detail_id joinKeyorder_id parentKeyorder_id autoIncrementtrue /
/table
注在childTable标签中没有定义 dataNode属性因此说明字表和父表公用此属性
joinKey 父表和字表关联的键parentKey 父表主键primaryKey order_detail表的主键autoIncrement 全局自增id 一旦开启需要在配置文件中配置才可以生效
由于order_detail配置了autoIncrementtrue 这个属性因此我们需要配置order_detail表的全局自增id 配置order_detail表的全局自增id
二、配置order_detail表的全局自增id
需要在sequence_db_conf.properties文件中添加order_detail的id数据节点
cd /app/mycat/conf/
vim sequence_db_conf.properties#sequence stored in datanode
GLOBALmycat
ORDER_MASTERmycat
ORDER_DETAILmycat设置自增配置项‘
mysql -uroot -p123456
use mycat;# 查询现有
mysql select * from MYCAT_SEQUENCE;
----------------------------------------
| name | current_value | increment |
----------------------------------------
| GLOBAL | 1 | 1 |
| ORDER_MASTER | 11 | 1 |
----------------------------------------# 插入新的自增配置项
mysql insert into MYCAT_SEQUENCE values (ORDER_DETAIL,1,1);
Query OK, 1 row affected (0.00 sec)mysql select * from MYCAT_SEQUENCE;
----------------------------------------
| name | current_value | increment |
----------------------------------------
| GLOBAL | 1 | 1 |
| ORDER_DETAIL | 1 | 1 |
| ORDER_MASTER | 11 | 1 |
----------------------------------------
3 rows in set (0.00 sec)# 为了演示好看将自增ID都改成从1开始生产环境不能操作这一步也可以不操作
mysql update MYCAT_SEQUENCE set current_value 1 where name ORDER_MASTER;
Query OK, 1 row affected (0.00 sec)
Rows matched: 1 Changed: 1 Warnings: 0mysql select * from MYCAT_SEQUENCE;
----------------------------------------
| name | current_value | increment |
----------------------------------------
| GLOBAL | 1 | 1 |
| ORDER_DETAIL | 1 | 1 |
| ORDER_MASTER | 1 | 1 |
----------------------------------------
3 rows in set (0.00 sec)重启mycat
mycat stopmycat start# 登录mycat批量插入order_master和order_detail表的数据
mysql -uapp_imooc -p123456 -h192.168.92.101 -P8066use imooc_db;# 初始化脚本批量插入order_master和order_detail表的数据 从上面图的order_id中可以看出order_master和order_detail都在通一个分片中
select a.order_id,order_sn,product_name from order_master a join order_detail b on a.order_idb.order_id;到此ER跨分片查询的问题已经解决
下一篇企业实战_18_MyCat_ZK集群安装部署 https://gblfy.blog.csdn.net/article/details/100075631