企业实战_17_MyCat水平扩展_跨分片查询_ER分片
接上一篇:企業(yè)實(shí)戰(zhàn)_16_MyCat全局自增ID
https://blog.csdn.net/weixin_40816738/article/details/100064315
案例比較:
在垂直拆分場景中,針對字段個數(shù)少的類型為字典類型的表,我們可以使用全局表的方式解決。
在水平擴(kuò)展場景中,針對數(shù)據(jù)量很大的表,怎樣實(shí)現(xiàn)跨分片查詢呢? ER分片
文章目錄
- 一、跨分片查詢的另一個場景
- 1. 思考
- 2. 回顧!
- 3. 目前,歸納
- 二、配置order_detail表的全局自增id
一、跨分片查詢的另一個場景
1. 思考
order_master表進(jìn)行了切片操作,而order_detail沒有進(jìn)行切片操作, 2張表,不在一個分片中,現(xiàn)在這種關(guān)聯(lián)屬于跨分片關(guān)聯(lián),針對這種跨分片的查詢應(yīng)該如何處理呢?
2. 回顧!
- 在垂直拆分場景中,針對這種跨分片查詢的情況,有3種方式解決跨分片查詢。
| api | 結(jié)果拼接,比較耗時 |
| 數(shù)據(jù)冗余 | 數(shù)據(jù)冗余量大 |
| 全局表 | 字段少 字典類型的表 |
3. 目前,歸納
- 在水平擴(kuò)展場景,針對這種跨分片查詢的情況,使用方式解決跨分片查詢。
| ER分片 | 字段多,訪問頻繁,數(shù)據(jù)集大 |
- 得出結(jié)論!
全局表:適用于字段少的字典類型的表的場景,而order_master訂單表是一個非常龐大的表,調(diào)用比較頻繁,因此并不適合使用全局表的應(yīng)用場景。
ER分片表,是通過ER關(guān)系來進(jìn)行分片的,可以把需要兩個關(guān)聯(lián)的表,根據(jù)他們的關(guān)聯(lián)鍵,把要關(guān)聯(lián)的這些數(shù)據(jù)分布到同一個分片內(nèi),那么,我們在同一個分片內(nèi)來解決這個關(guān)聯(lián)問題,以此來,解決跨分片查詢的問題
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數(shù)據(jù)庫中創(chuàng)建order_detail表
初始化創(chuàng)建表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 '購買商品數(shù)量',`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 '優(yōu)惠分?jǐn)偨痤~',`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='訂單詳情表';數(shù)據(jù)清理
# 刪除order_master的數(shù)據(jù) mysql -uapp_imooc -p123456 -h192.168.92.101 -P8066 use imooc_db; delete from order_master;添加分片配置
修改編輯schema.xml
order_master在的table標(biāo)簽中添加childTable 標(biāo)簽,并把下面以前定義的的order_detailtable標(biāo)簽刪除
注:在childTable標(biāo)簽中,沒有定義 dataNode屬性,因此,說明字表和父表公用此屬性
- joinKey 父表和字表關(guān)聯(lián)的鍵
- 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數(shù)據(jù)節(jié)點(diǎn)
cd /app/mycat/conf/ vim sequence_db_conf.properties#sequence stored in datanode GLOBAL=mycat ORDER_MASTER=mycat ORDER_DETAIL=mycat設(shè)置自增配置項‘
mysql -uroot -p123456 use mycat;# 查詢現(xiàn)有 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開始,生產(chǎn)環(huán)境不能操作,這一步也可以不操作 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表的數(shù)據(jù) mysql -uapp_imooc -p123456 -h192.168.92.101 -P8066use imooc_db;# 初始化腳本,批量插入order_master和order_detail表的數(shù)據(jù)
從上面圖的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跨分片查詢的問題已經(jīng)解決!
下一篇:企業(yè)實(shí)戰(zhàn)_18_MyCat_ZK集群安裝部署
https://gblfy.blog.csdn.net/article/details/100075631
總結(jié)
以上是生活随笔為你收集整理的企业实战_17_MyCat水平扩展_跨分片查询_ER分片的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: node+express项目链接MySQ
- 下一篇: MyBatis-Plus_删除操作