摘要: 數據庫拆分後,數據分佈到不同的數據庫實例,可達到降低數據量,增加實例數的擴容目的。然而前途是美好的,道路是曲折的。一旦涉及拆分,就逃不開“原本在同一數據庫裏的查詢,要變成跨兩個數據庫實例”的查詢問題。
導讀
日前,某電商用戶由於業務發展迅猛,訪問量極速增長,導致數據庫容量及性能遭遇瓶頸。爲降低數據庫大小,提升性能,用戶決定對架構進行垂直拆分。根據不同的表來進行拆分,對應用程序的影響也更小,拆分規則也會比較簡單清晰。
該用戶按照會員、商品、訂單,將數據垂直拆分至三個數據庫,分庫後數據分佈到不同的數據庫實例,以達到降低數據量,增加實例數的擴容目的。然而前途是美好的,道路是曲折的。一旦涉及拆分,就逃不開“原本在同一數據庫裏的查詢,要變成跨兩個數據庫實例”的查詢問題。
單庫時,系統中很多列表和詳情頁所需數據可以簡單通過SQL join關聯表查詢;而拆庫後,拆分後的數據可能分佈在不同的節點/實例上,不能跨庫使用join,此時join帶來的問題就很棘手了。
例如:業務中需要展示某個品類商品的售賣訂單量,現在訂單數據和商品數據分佈在兩個獨立的數據庫實例中,業務上要怎麼進行關聯查詢?
用戶首先想到的方法是,對現有業務代碼進行重構,分別從兩個數據庫查詢數據,然後在業務代碼中進行join關聯。那麼問題來了,如果採用這個解決方案,業務上那麼多查詢改造起來,拆分難度極大,操作起來過於複雜。跨庫join操作又沒有非常高效的辦法,需要各個分庫迭代查詢,查詢效率也會有一定影響。
是不是光想想就一個頭兩個大?別擔心,關於數據庫拆分後的業務改造難題,其實用一條SQL就可輕鬆搞定。具體解法如下⬇️
解決思路
經溝通,我們發現用戶遇到的其實就是典型的跨數據庫實例查詢問題。目前,阿里雲DMS已經支持跨數據庫實例SQL查詢的能力,用戶可以通過DMS,利用一條SQL即可解決上述難題。不僅能夠滿足“跨庫Join”這一核心訴求,還能極大地簡化用戶的技術方案。
除了開篇介紹的客戶案例,DMS跨數據庫實例的查詢功能可以解決我們業務中遇到的任意跨數據庫查詢的訴求。例如:跨線上庫及歷史庫的join查詢,快速獲取全量數據;單元化架構下,join各個單元的數據庫查詢全局數據;遊戲業務,可以join MySQL中的用戶數據及MongoDB中的遊戲裝備數據等。
接下來,我們通過一個快速上手的實例,來看看用戶如何寫這條SQL。
商品庫的信息
實例連接:198.12.13.1:3306 , 數據庫名:seller
商品表名:commodity
包含部分字段的表結構:
訂單庫的信息
實例連接:198.12.13.2:3306 , 數據庫名:buyer
訂單表表名:order_list
包含部分字段的表結構:
創建DBLink
在編寫查詢SQL之前,需要先在DMS中配置賣家庫和買家庫的DBLink。
編寫並運行跨庫查詢SQL
當DBLink配置完成後,即可開始在DMS中編寫並運行SQL,實現查詢某個商品的訂單列表的需求。
這個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
DMS提供的跨數據庫實例查詢功能孵化於阿里巴巴集團,目前已服務超過5000名開發者,全面支撐阿里巴巴跨數據庫實例的所有線上查詢需求。DMS支持跨同異構數據庫的在線查詢,支持MySQL、SQLServer、PostgreSQL及Redis等數據源,爲應用提供了一種數據全局查詢的能力。用戶無需通過數據彙集,即可通過標準SQL實現跨實例的交叉查詢。
立即體驗
阿里雲雙十一1折拼團活動:已滿6人,都是最低折扣了
【滿6人】1核2G雲服務器99.5元一年298.5元三年 2核4G雲服務器545元一年 1227元三年
【滿6人】1核1G MySQL數據庫 119.5元一年
【滿6人】3000條國內短信包 60元每6月