一、垂直分庫(kù)場(chǎng)景
場(chǎng)景:在業(yè)務(wù)系統(tǒng)中,涉及一下表結(jié)構(gòu),但是由于用戶(hù)與訂單每天都會(huì)產(chǎn)生大量的數(shù)據(jù),單臺(tái)服務(wù)器的數(shù)據(jù)存儲(chǔ)以及處理能力是有限的,可以對(duì)數(shù)據(jù)庫(kù)表進(jìn)行拆分,原有數(shù)據(jù)庫(kù)如下
說(shuō)明1:整個(gè)業(yè)務(wù)系統(tǒng)中的表,大致分為四個(gè),商品信息類(lèi)的表,訂單相關(guān)的表,用戶(hù)相關(guān)表及省市區(qū)相關(guān)的表,這里暫時(shí)將省市區(qū)的表和用戶(hù)相關(guān)的表放在一個(gè)數(shù)據(jù)節(jié)點(diǎn)上。
說(shuō)明2:因?yàn)樯唐?,訂單和用?hù)相關(guān)的數(shù)據(jù),每天都會(huì)產(chǎn)生海量的數(shù)據(jù),所以我們采取的分庫(kù)策略是將不同業(yè)務(wù)類(lèi)型數(shù)據(jù),放在不同數(shù)據(jù)庫(kù)中,即垂直分庫(kù)。
?
二、準(zhǔn)備工作
在192.168.3.90,192.168.3.91,192.168.3.92三臺(tái)服務(wù)器上創(chuàng)建shopping數(shù)據(jù)庫(kù)
三、配置schema.xml
說(shuō)明1:在schema標(biāo)簽里面的table標(biāo)簽不需要rule屬性的,只有在分表時(shí)才需要rule,我們現(xiàn)在是分庫(kù)操作,不需要rule屬性
說(shuō)明2:在table標(biāo)簽中,商品相關(guān)的表都放在dn1數(shù)據(jù)節(jié)點(diǎn)上,和訂單相關(guān)的表都放在dn2數(shù)據(jù)節(jié)點(diǎn)上,和用戶(hù)和地址相關(guān)的都放在dn3數(shù)據(jù)節(jié)點(diǎn)上
四、配置server.xml
說(shuō)明1:修改schemas標(biāo)簽中的數(shù)據(jù)庫(kù)名稱(chēng)為shopping??
五、Mycat分庫(kù)測(cè)試
首先因?yàn)樾薷腗ycat的配置文件,所以需要重啟一下Mycat,保證新的配置起作用。
重啟之后,在192.168.3.91服務(wù)器上連接Mycat
查看邏輯庫(kù)和邏輯表
說(shuō)明1:目前這些表都還只是邏輯表,在mycat中存在,但是在MySQL的數(shù)據(jù)庫(kù)中都沒(méi)不存在,所以還需要把這些表創(chuàng)建出來(lái)。
說(shuō)明2:這里我們創(chuàng)建三個(gè)表作為代表,其他暫時(shí)用不到的表就先不創(chuàng)建了,每個(gè)數(shù)據(jù)節(jié)點(diǎn)上創(chuàng)建一個(gè)表,然后這些表就會(huì)自動(dòng)的出現(xiàn)在配置好的數(shù)據(jù)節(jié)點(diǎn)上。
create table tb_goods_base(id int auto_increment primary key, goods_name varchar(20), category varchar(20), price int); create table tb_order_master(order_id int auto_increment primary key, money int, goods_id int, receiver_province varchar(6), receiver_city varchar(6), receiver varchar(20)); create table tb_user(id int auto_increment primary key, name varchar(20), age int, gender varchar(1));
?
在往每個(gè)表中插入一些測(cè)試數(shù)據(jù)
insert into tb_user (name, age, gender) values ("張三", 21, "男"); insert into tb_user (name, age, gender) values ("李四", 22, "女"); insert into tb_user (name, age, gender) values ("王五", 23, "男");
insert into tb_goods_base (goods_name, category, price) values ("華為手機(jī)","家電", 5888); insert into tb_goods_base (goods_name, category, price) values ("中國(guó)李寧","服裝", 499); insert into tb_goods_base (goods_name, category, price) values ("雙匯火腿","食品", 15); insert into tb_order_master (money, goods_id, receiver_province, receiver_city, receiver) values (5888, 1, "130000", "130200", "張三"); insert into tb_order_master (money, goods_id, receiver_province, receiver_city, receiver) values (499, 2, "130000", "130800", "李四"); insert into tb_order_master (money, goods_id, receiver_province, receiver_city, receiver) values (15, 3, "110000", 110100, "王五");
以上是對(duì)Mycat數(shù)據(jù)垂直分庫(kù)的創(chuàng)建表,插入數(shù)據(jù)和查詢(xún)數(shù)據(jù)的測(cè)試。
六、Mycat多表查詢(xún)測(cè)試
情況一:同一數(shù)據(jù)節(jié)點(diǎn)上的多表查詢(xún)
首先創(chuàng)建一個(gè)三個(gè)的表用于測(cè)試,同一數(shù)據(jù)節(jié)點(diǎn)內(nèi)的多表查詢(xún),tb_areas_provinces, tb_areas_city, tb_user_address 三個(gè)表都是在dn3數(shù)據(jù)節(jié)點(diǎn)上的。
create table tb_areas_provinces (id int auto_increment primary key, provinceid varchar(6), province varchar(20)); create table tb_areas_city (id int auto_increment primary key, cityid varchar(6), city varchar(20), provinceid varchar(6)); create table tb_user_address (id int auto_increment primary key, user_id int, province_id varchar(6), city_id varchar(6), address varchar(20));
說(shuō)明1:根據(jù)分庫(kù)策略,創(chuàng)建的這三個(gè)測(cè)試表,都是屬于用戶(hù)和地址相關(guān)的數(shù)據(jù),都在dn3數(shù)據(jù)節(jié)點(diǎn)上。
添加一些測(cè)試數(shù)據(jù)
insert into tb_areas_provinces (provinceid, province) values ("110000", "北京市"); insert into tb_areas_provinces (provinceid, province) values ("120000", "天津市"); insert into tb_areas_provinces (provinceid, province) values ("130000", "河北省"); insert into tb_areas_city (cityid, city, provinceid) values ("110100", "市轄區(qū)", "110000"); insert into tb_areas_city (cityid, city, provinceid) values ("130200", "唐山市", "130000"); insert into tb_areas_city (cityid, city, provinceid) values ("130800", "承德市", "130000"); insert into tb_user_address (user_id, province_id, city_id, address) values (1, "110000", "110100", "清河毛紡廠"); insert into tb_user_address (user_id, province_id, city_id, address) values (2, "130000", "130200", "里二胡同"); insert into tb_user_address (user_id, province_id, city_id, address) values (3, "130000", "130800", "避暑山莊");
現(xiàn)多表查詢(xún)需求是:根據(jù)tb_user, tb_user_address表,tb_areas_provinces表和tb_areas_city表查出用戶(hù)的名字已經(jīng)所在的省,市,已經(jīng)詳細(xì)的地址:使用Mycat查詢(xún)
select u.name, p.province, c.city, ua.address from tb_user as u, tb_user_address as ua, tb_areas_provinces as p, tb_areas_city as c where u.id = ua.user_id and ua.province_id = p.provinceid and ua.city_id = c.cityid;
說(shuō)明:同一數(shù)據(jù)節(jié)點(diǎn)內(nèi)的多表聯(lián)合查詢(xún)?cè)趍ycat中可以正確查出結(jié)果。?
select o.order_id, o.receiver,p.province, c.city from tb_order_master as o, tb_areas_provinces as p, tb_areas_city as c where o.receive_province=p.provinceid and o.receiver_city=c.cityid;
這個(gè)時(shí)候就報(bào)錯(cuò)了, 報(bào)錯(cuò)的原因是:夸數(shù)據(jù)節(jié)點(diǎn)的多表查詢(xún),在執(zhí)行sql的時(shí)候,Mycat并不知道,將這條sql給哪一個(gè)數(shù)據(jù)節(jié)點(diǎn)處理。
解決方式:將一些數(shù)據(jù)量少,并且一旦確定了就很少改變的表,設(shè)置為全局表,全局表可以在每個(gè)數(shù)據(jù)節(jié)點(diǎn)上都能訪問(wèn)。而本案例中的省/市表就符合這個(gè)特性,中國(guó)每個(gè)城市的編碼一旦確定,幾乎就不會(huì)變化,這樣的數(shù)據(jù)表,我們就可以設(shè)置為全局表。全局表會(huì)存在每一個(gè)數(shù)據(jù)節(jié)點(diǎn)上。
如果要設(shè)置全局表,只需要在schema.xml設(shè)置邏輯表的時(shí)候加上 type="global"參數(shù)即可
說(shuō)明1: 因?yàn)槭∈邢嚓P(guān)的數(shù)據(jù)表需要在dn1,dn2,dn3 三個(gè)數(shù)據(jù)節(jié)點(diǎn)上,所以dataNode這里要設(shè)置dn1,dn2,dn3三個(gè)節(jié)點(diǎn)
說(shuō)明2:在table標(biāo)簽內(nèi)添加type="global"屬性
說(shuō)明3:因?yàn)橹暗腶reas的表,都要變成全局表,所以需要數(shù)據(jù)清空在重新添加測(cè)試數(shù)據(jù)
說(shuō)明4:因?yàn)樾薷牧薓ycat配置,所以需要重新啟動(dòng)Mycat
重新創(chuàng)建tb_areas_provinces和tb_areas_city兩個(gè)表
create table tb_areas_provinces (id int auto_increment primary key, provinceid varchar(6), province varchar(20)); create table tb_areas_city (id int auto_increment primary key, cityid varchar(6), city varchar(20), provinceid varchar(6));
說(shuō)明5:這時(shí)候就會(huì)發(fā)現(xiàn)tb_areas_procinces和tb_areas_city出現(xiàn)在了三個(gè)數(shù)據(jù)節(jié)點(diǎn)上
再次插入數(shù)據(jù)進(jìn)行多表查詢(xún)測(cè)試:
insert into tb_areas_provinces (provinceid, province) values ("110000", "北京市"); insert into tb_areas_provinces (provinceid, province) values ("120000", "天津市"); insert into tb_areas_provinces (provinceid, province) values ("130000", "河北省"); insert into tb_areas_city (cityid, city, provinceid) values ("110100", "市轄區(qū)", "110000"); insert into tb_areas_city (cityid, city, provinceid) values ("130200", "唐山市", "130000"); insert into tb_areas_city (cityid, city, provinceid) values ("130800", "承德市", "130000");
會(huì)發(fā)現(xiàn)插入的這些測(cè)試數(shù)據(jù),會(huì)在dn1,dn2,dn3的每個(gè)數(shù)據(jù)節(jié)點(diǎn)的表中都添加成功。
現(xiàn)在就可以順利的進(jìn)行多表查詢(xún)了。
文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-760150.html
說(shuō)明6:當(dāng)全局表中的數(shù)據(jù)發(fā)生改變的時(shí)候,每個(gè)數(shù)據(jù)節(jié)點(diǎn)下的表,也都會(huì)發(fā)生數(shù)據(jù)改變。?文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-760150.html
到了這里,關(guān)于MySQL運(yùn)維6-Mycat分庫(kù)分表之垂直分庫(kù)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!