教你用一條SQL搞定跨資料庫查詢難題

許此一生發表於2018-11-02

摘要:
資料庫拆分後,資料分佈到不同的資料庫例項,可達到降低資料量,增加例項數的擴容目的。然而前途是美好的,道路是曲折的。一旦涉及拆分,就逃不開“原本在同一資料庫裡的查詢,要變成跨兩個資料庫例項”的查詢問題。

導讀

日前,某電商使用者由於業務發展迅猛,訪問量極速增長,導致資料庫容量及效能遭遇瓶頸。為降低資料庫大小,提升效能,使用者決定對架構進行垂直拆分。根據不同的表來進行拆分,對應用程式的影響也更小,拆分規則也會比較簡單清晰。

該使用者按照會員、商品、訂單,將資料垂直拆分至三個資料庫,分庫後資料分佈到不同的資料庫例項,以達到降低資料量,增加例項數的擴容目的。然而前途是美好的,道路是曲折的。一旦涉及拆分,就逃不開“原本在同一資料庫裡的查詢,要變成跨兩個資料庫例項”的查詢問題

單庫時,系統中很多列表和詳情頁所需資料可以簡單通過SQL join關聯表查詢;而拆庫後,拆分後的資料可能分佈在不同的節點/例項上,不能跨庫使用join,此時join帶來的問題就很棘手了。

_7_8
例如:業務中需要展示某個品類商品的售賣訂單量,現在訂單資料和商品資料分佈在兩個獨立的資料庫例項中,業務上要怎麼進行關聯查詢?

使用者首先想到的方法是,對現有業務程式碼進行重構,分別從兩個資料庫查詢資料,然後在業務程式碼中進行join關聯。那麼問題來了,如果採用這個解決方案,業務上那麼多查詢改造起來,拆分難度極大,操作起來過於複雜。跨庫join操作又沒有非常高效的辦法,需要各個分庫迭代查詢,查詢效率也會有一定影響。

是不是光想想就一個頭兩個大?別擔心,關於資料庫拆分後的業務改造難題,其實用一條SQL就可輕鬆搞定。具體解法如下⬇️

解決思路

經溝通,我們發現使用者遇到的其實就是典型的跨資料庫例項查詢問題。目前,阿里雲DMS已經支援跨資料庫例項SQL查詢的能力,使用者可以通過DMS,利用一條SQL即可解決上述難題。不僅能夠滿足“跨庫Join”這一核心訴求,還能極大地簡化使用者的技術方案。
_9_10
除了開篇介紹的客戶案例,DMS跨資料庫例項的查詢功能可以解決我們業務中遇到的任意跨資料庫查詢的訴求。例如:跨線上庫及歷史庫的join查詢,快速獲取全量資料;單元化架構下,join各個單元的資料庫查詢全域性資料;遊戲業務,可以join MySQL中的使用者資料及MongoDB中的遊戲裝備資料等。

接下來,我們通過一個快速上手的例項,來看看使用者如何寫這條SQL。

商品庫的資訊

例項連線:198.12.13.1:3306 , 資料庫名:seller
商品表名:commodity
包含部分欄位的表結構:

create table commondity(
id BIGINT(20),  -- 商品ID
name varchar(100), -- 商品名稱
create_time TIMESTAMP ,  -- 商品入庫時間
catogary BIGINT(30), -- 商品類目
features text,  -- 商品描述
param text); -- 商品屬性
複製程式碼

訂單庫的資訊

例項連線:198.12.13.2:3306 , 資料庫名:buyer
訂單表表名:order_list
包含部分欄位的表結構:

create table order_list(
id BIGINT(20),  -- 訂單ID
buyer_id BIGINT(30), -- 買家ID
create_time TIMESTAMP ,  -- 訂單生成時間
seller_id BIGINT(30), -- 賣家ID
commodity_id BIGINT(30), -- 商品ID
status int(8) – 訂單狀態)
複製程式碼

建立DBLink

在編寫查詢SQL之前,需要先在DMS中配置賣家庫和買家庫的DBLink。
_3_4

編寫並執行跨庫查詢SQL

當DBLink配置完成後,即可開始在DMS中編寫並執行SQL,實現查詢某個商品的訂單列表的需求。

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。
所以,業務方只需要使用DMS跨資料庫查詢SQL便可輕鬆解決拆庫之後的跨庫查詢難題,業務基本無需改造。

什麼是DMS跨資料庫查詢

SELECT * FROM

oracle
.dsqltest.b oracle inner join

mysql
.dsqltest.a mysql on oracle.id = mysql.id
WHERE oracle.id=1

_5

DMS提供的跨資料庫例項查詢功能孵化於阿里巴巴集團,目前已服務超過5000名開發者,全面支撐阿里巴巴跨資料庫例項的所有線上查詢需求。DMS支援跨同異構資料庫的線上查詢,支援MySQL、SQLServer、PostgreSQL及Redis等資料來源,為應用提供了一種資料全域性查詢的能力。使用者無需通過資料彙集,即可通過標準SQL實現跨例項的交叉查詢。

立即體驗

  1. 請先登入DMS控制檯
  2. 從SQL操作中,進入跨例項SQL視窗。
    _6
  3. 參考使用指南,建立DBlink,編寫並執行SQL。

阿里雲雙十一1折拼團活動:已滿6人,都是最低折扣了

【滿6人】1核2G雲伺服器99.5元一年298.5元三年 2核4G雲伺服器545元一年 1227元三年

【滿6人】1核1G MySQL資料庫 119.5元一年

【滿6人】3000條國內簡訊包 60元每6月

參團地址:click.aliyun.com/m/100002029…


相關文章