教你用一條SQL搞定跨數據庫查詢難題

摘要: 數據庫拆分後,數據分佈到不一樣的數據庫實例,可達到下降數據量,增長實例數的擴容目的。然而前途是美好的,道路是曲折的。一旦涉及拆分,就逃不開「本來在同一數據庫裏的查詢,要變成跨兩個數據庫實例」的查詢問題。html

導讀

日前,某電商用戶因爲業務發展迅猛,訪問量極速增加,致使數據庫容量及性能遭遇瓶頸。爲下降數據庫大小,提高性能,用戶決定對架構進行垂直拆分。根據不一樣的表來進行拆分,對應用程序的影響也更小,拆分規則也會比較簡單清晰。mysql

該用戶按照會員、商品、訂單,將數據垂直拆分至三個數據庫,分庫後數據分佈到不一樣的數據庫實例,以達到下降數據量,增長實例數的擴容目的。然而前途是美好的,道路是曲折的。一旦涉及拆分,就逃不開「本來在同一數據庫裏的查詢,要變成跨兩個數據庫實例」的查詢問題sql

單庫時,系統中不少列表和詳情頁所需數據能夠簡單經過SQL join關聯表查詢;而拆庫後,拆分後的數據可能分佈在不一樣的節點/實例上,不能跨庫使用join,此時join帶來的問題就很棘手了。數據庫

_7_8
例如:業務中須要展現某個品類商品的售賣訂單量,如今訂單數據和商品數據分佈在兩個獨立的數據庫實例中,業務上要怎麼進行關聯查詢?服務器

用戶首先想到的方法是,對現有業務代碼進行重構,分別從兩個數據庫查詢數據,而後在業務代碼中進行join關聯。那麼問題來了,若是採用這個解決方案,業務上那麼多查詢改造起來,拆分難度極大,操做起來過於複雜。跨庫join操做又沒有很是高效的辦法,須要各個分庫迭代查詢,查詢效率也會有必定影響。架構

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

解決思路

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

接下來,咱們經過一個快速上手的實例,來看看用戶如何寫這條SQL。阿里雲

商品庫的信息

實例鏈接:198.12.13.1:3306 , 數據庫名:seller
商品表名:commodity
包含部分字段的表結構:spa

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月
參團地址:http://click.aliyun.com/m/1000020293/

做者: 七幕
原文連接 本文爲雲棲社區原創內容,未經容許不得轉載。

相關文章
相關標籤/搜索