教你用一條SQL搞定跨資料庫查詢難題
摘要: 資料庫拆分後,資料分佈到不同的資料庫例項,可達到降低資料量,增加例項數的擴容目的。然而前途是美好的,道路是曲折的。一旦涉及拆分,就逃不開“原本在同一資料庫裡的查詢,要變成跨兩個資料庫例項”的查詢問題。
導讀
日前,某電商使用者由於業務發展迅猛,訪問量極速增長,導致資料庫容量及效能遭遇瓶頸。為降低資料庫大小,提升效能,使用者決定對架構進行垂直拆分。根據不同的表來進行拆分,對應用程式的影響也更小,拆分規則也會比較簡單清晰。
該使用者按照會員、商品、訂單,將資料垂直拆分至三個資料庫,分庫後資料分佈到不同的資料庫例項,以達到降低資料量,增加例項數的擴容目的。然而前途是美好的,道路是曲折的。 一旦涉及拆分,就逃不開“原本在同一資料庫裡的查詢,要變成跨兩個資料庫例項”的查詢問題 。
單庫時,系統中很多列表和詳情頁所需資料可以簡單透過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
包含部分欄位的表結構:
create table commondity(id BIGINT(20), -- 商品IDname 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), -- 訂單IDbuyer_id BIGINT(30), -- 買家IDcreate_time TIMESTAMP , -- 訂單生成時間seller_id BIGINT(30), -- 賣家IDcommodity_id BIGINT(30), -- 商品IDstatus int(8) – 訂單狀態)
建立DBLink
在編寫查詢SQL之前,需要先在DMS中配置賣家庫和買家庫的DBLink。
編寫並執行跨庫查詢SQL
當DBLink配置完成後,即可開始在DMS中編寫並執行SQL,實現查詢某個商品的訂單列表的需求。
SELECT comomndity.catogary, count(1) from buyer_db.buyer.order_list order, seller_db.seller.commondity commonditywhere order.commodity_id= commondity.idGROUP 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
DMS提供的跨資料庫例項查詢功能孵化於阿里巴巴集團,目前已服務超過5000名開發者,全面支撐阿里巴巴跨資料庫例項的所有線上查詢需求。DMS支援跨同異構資料庫的線上查詢,支援MySQL、SQLServer、PostgreSQL及Redis等資料來源,為應用提供了一種資料全域性查詢的能力。使用者無需透過資料彙集,即可透過標準SQL實現跨例項的交叉查詢。
立即體驗
-
請先登入 。
-
從SQL操作中,進入跨例項SQL視窗。
-
參考 使用指南 ,建立DBlink,編寫並執行SQL。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/31551794/viewspace-2218542/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 一條SQL完成跨資料庫例項Join查詢SQL資料庫
- SQL Server 跨資料庫查詢SQLServer資料庫
- SQL Server 查詢資料庫中所有表資料條數SQLServer資料庫
- 20240719資料庫關聯查詢、條件查詢資料庫
- Android SQL資料庫查詢方法 query( )AndroidSQL資料庫
- MYSQL資料庫複雜查詢練習題(難度適中)MySql資料庫
- T-SQL——關於跨庫連線查詢SQL
- SQL Server實戰四:查詢資料庫的資料SQLServer資料庫
- 解析MSSQL跨資料庫查詢的實現方法SQL資料庫
- MySQL資料庫:7、SQL常用查詢語句MySql資料庫
- efcore 跨表查詢,實現一個介面內查詢兩個不同資料庫裡各自的表資料資料庫
- 關係型資料庫查詢語言 SQL 和圖資料庫查詢語言 nGQL 對比資料庫SQL
- MyBatis 查詢資料時屬性中多對一的問題(多條資料對應一條資料)MyBatis
- oracle資料庫sql查詢檢視第二次查詢很慢Oracle資料庫SQL
- Logtail:像查詢資料庫一樣查詢日誌AI資料庫
- SQL的資料庫操作:新增、更新、刪除、查詢SQL資料庫
- 概括SQL Server實時查詢Oracle資料庫WSSQLServerOracle資料庫
- go 連線資料庫 - GORM學習 - sql查詢Go資料庫ORMSQL
- SQL Server資料庫————模糊查詢和聚合函式SQLServer資料庫函式
- SQL server資料庫表碎片比例查詢語句SQLServer資料庫
- Query.js - 類SQL前端資料查詢類庫JSSQL前端
- CDA資料分析師 - SQL資料庫基礎 查詢&連線SQL資料庫
- 資料庫高階查詢之子查詢資料庫
- Mysql 資料庫 -------- SQL語句進階查詢 ------- 前部分MySql資料庫
- Jemter查詢資料庫資料庫
- 求助:資料庫查詢資料庫
- ThinkPHP 資料庫查詢PHP資料庫
- 資料庫排序查詢資料庫排序
- 查詢資料庫大小資料庫
- SQL-基礎語法 - 條件查詢 - 模糊查詢SQL
- MySQL資料庫詳解(一)SQL查詢語句是如何執行的?MySql資料庫
- mysql 查詢出重複資料的第一條MySql
- 使用sql語句查詢平均值,使用sql語句查詢資料總條數, not in 篩選語句的使用SQL
- 一條 SQL 查詢語句是如何執行的?SQL
- 提高跨庫查詢速度,你只需一個Smartbi
- 資料庫基礎查詢--單表查詢資料庫
- 記一次資料庫查詢超時優化問題資料庫優化
- SQL Server 資料庫查詢死鎖的處理步驟SQLServer資料庫