教你用一条SQL搞定跨数据库查询难题
導(dǎo)讀
日前,某電商用戶由于業(yè)務(wù)發(fā)展迅猛,訪問量極速增長,導(dǎo)致數(shù)據(jù)庫容量及性能遭遇瓶頸。為降低數(shù)據(jù)庫大小,提升性能,用戶決定對架構(gòu)進(jìn)行垂直拆分。根據(jù)不同的表來進(jìn)行拆分,對應(yīng)用程序的影響也更小,拆分規(guī)則也會比較簡單清晰。
該用戶按照會員、商品、訂單,將數(shù)據(jù)垂直拆分至三個數(shù)據(jù)庫,分庫后數(shù)據(jù)分布到不同的數(shù)據(jù)庫實例,以達(dá)到降低數(shù)據(jù)量,增加實例數(shù)的擴(kuò)容目的。然而前途是美好的,道路是曲折的。一旦涉及拆分,就逃不開“原本在同一數(shù)據(jù)庫里的查詢,要變成跨兩個數(shù)據(jù)庫實例”的查詢問題。
單庫時,系統(tǒng)中很多列表和詳情頁所需數(shù)據(jù)可以簡單通過SQL join關(guān)聯(lián)表查詢;而拆庫后,拆分后的數(shù)據(jù)可能分布在不同的節(jié)點/實例上,不能跨庫使用join,此時join帶來的問題就很棘手了。
例如:業(yè)務(wù)中需要展示某個品類商品的售賣訂單量,現(xiàn)在訂單數(shù)據(jù)和商品數(shù)據(jù)分布在兩個獨立的數(shù)據(jù)庫實例中,業(yè)務(wù)上要怎么進(jìn)行關(guān)聯(lián)查詢?
用戶首先想到的方法是,對現(xiàn)有業(yè)務(wù)代碼進(jìn)行重構(gòu),分別從兩個數(shù)據(jù)庫查詢數(shù)據(jù),然后在業(yè)務(wù)代碼中進(jìn)行join關(guān)聯(lián)。那么問題來了,如果采用這個解決方案,業(yè)務(wù)上那么多查詢改造起來,拆分難度極大,操作起來過于復(fù)雜。跨庫join操作又沒有非常高效的辦法,需要各個分庫迭代查詢,查詢效率也會有一定影響。
是不是光想想就一個頭兩個大?別擔(dān)心,關(guān)于數(shù)據(jù)庫拆分后的業(yè)務(wù)改造難題,其實用一條SQL就可輕松搞定。具體解法如下??
解決思路
經(jīng)溝通,我們發(fā)現(xiàn)用戶遇到的其實就是典型的跨數(shù)據(jù)庫實例查詢問題。目前,阿里云DMS已經(jīng)支持跨數(shù)據(jù)庫實例SQL查詢的能力,用戶可以通過DMS,利用一條SQL即可解決上述難題。不僅能夠滿足“跨庫Join”這一核心訴求,還能極大地簡化用戶的技術(shù)方案。
除了開篇介紹的客戶案例,DMS跨數(shù)據(jù)庫實例的查詢功能可以解決我們業(yè)務(wù)中遇到的任意跨數(shù)據(jù)庫查詢的訴求。例如:跨線上庫及歷史庫的join查詢,快速獲取全量數(shù)據(jù);單元化架構(gòu)下,join各個單元的數(shù)據(jù)庫查詢?nèi)謹(jǐn)?shù)據(jù);游戲業(yè)務(wù),可以join MySQL中的用戶數(shù)據(jù)及MongoDB中的游戲裝備數(shù)據(jù)等。
接下來,我們通過一個快速上手的實例,來看看用戶如何寫這條SQL。
商品庫的信息
實例連接:198.12.13.1:3306 , 數(shù)據(jù)庫名:seller
商品表名:commodity
包含部分字段的表結(jié)構(gòu):
訂單庫的信息
實例連接:198.12.13.2:3306 , 數(shù)據(jù)庫名:buyer
訂單表表名:order_list
包含部分字段的表結(jié)構(gòu):單態(tài))
創(chuàng)建DBLink
在編寫查詢SQL之前,需要先在DMS中配置賣家?guī)旌唾I家?guī)斓腄BLink。
編寫并運(yùn)行跨庫查詢SQL
當(dāng)DBLink配置完成后,即可開始在DMS中編寫并運(yùn)行SQL,實現(xiàn)查詢某個商品的訂單列表的需求。
SELECT comomndity.catogary,count(1)from buyer_db.buyer.order_list order,seller_db.seller.commondity commondity where order.commodity_id= commondity.id GROUP BY commondity.catogary;這個SQL的語法完全兼容MySQL,只是在From的表名前面帶上DBLink。
所以,業(yè)務(wù)方只需要使用DMS跨數(shù)據(jù)庫查詢SQL便可輕松解決拆庫之后的跨庫查詢難題,業(yè)務(wù)基本無需改造。
什么是DMS跨數(shù)據(jù)庫查詢
?
SELECT * FROM?oracle.dsqltest.b oracle inner join
mysql.dsqltest.a mysql on oracle.id = mysql.id?
WHERE oracle.id=1
DMS提供的跨數(shù)據(jù)庫實例查詢功能孵化于阿里巴巴集團(tuán),目前已服務(wù)超過5000名開發(fā)者,全面支撐阿里巴巴跨數(shù)據(jù)庫實例的所有線上查詢需求。DMS支持跨同異構(gòu)數(shù)據(jù)庫的在線查詢,支持MySQL、SQLServer、PostgreSQL及Redis等數(shù)據(jù)源,為應(yīng)用提供了一種數(shù)據(jù)全局查詢的能力。用戶無需通過數(shù)據(jù)匯集,即可通過標(biāo)準(zhǔn)SQL實現(xiàn)跨實例的交叉查詢。
立即體驗
阿里云雙十一1折拼團(tuán)活動:滿6人,就是最低折扣了!
【滿6人】1核2G云服務(wù)器99.5元一年298.5元三年 2核4G云服務(wù)器545元一年 1227元三年
【滿6人】1核1G MySQL數(shù)據(jù)庫 119.5元一年
【滿6人】3000條國內(nèi)短信包 60元每6月
參團(tuán)地址:http://click.aliyun.com/m/1000020293/
原文鏈接
本文為云棲社區(qū)原創(chuàng)內(nèi)容,未經(jīng)允許不得轉(zhuǎn)載。
總結(jié)
以上是生活随笔為你收集整理的教你用一条SQL搞定跨数据库查询难题的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【双11】阿里云边缘节点ENS助力淘宝构
- 下一篇: 云原生时代来袭 下一代云数据库技术将走向