企业实战_17_MyCat水平扩展_跨分片查询_ER分片
接上一篇:企業實戰_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表
初始化創建表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`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 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標簽刪除
注:在childTable標簽中,沒有定義 dataNode屬性,因此,說明字表和父表公用此屬性
- joinKey 父表和字表關聯的鍵
- parentKey 父表主鍵
- primaryKey order_detail表的主鍵
- autoIncrement 全局自增id 一旦開啟需要在配置文件中配置才可以生效
由于order_detail配置了autoIncrement="true" 這個屬性,因此,我們需要配置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 GLOBAL=mycat ORDER_MASTER=mycat ORDER_DETAIL=mycat設置自增配置項‘
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_id=b.order_id;到此,ER跨分片查詢的問題已經解決!
下一篇:企業實戰_18_MyCat_ZK集群安裝部署
https://gblfy.blog.csdn.net/article/details/100075631
總結
以上是生活随笔為你收集整理的企业实战_17_MyCat水平扩展_跨分片查询_ER分片的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: node+express项目链接MySQ
- 下一篇: MyBatis-Plus_删除操作