一條SQL完成跨資料庫例項Join查詢

芊寶寶發表於2019-04-09

背景

隨著業務複雜程度的提高、資料規模的增長,越來越多的公司選擇對其線上業務資料庫進行垂直或水平拆分,甚至選擇不同的資料庫型別以滿足其業務需求。原本在同一資料庫例項裡就能實現的SQL查詢,現在需要跨多個資料庫例項才能完成。業務的資料被“散落”在各個地方,如何方便地對這些資料進行彙總關聯查詢,已經成為困擾使用者的一大難題。
針對這類問題,傳統的解決方案需要使用者提前將所有例項的資料提前彙集到彙總庫進行查詢分析。這種方案不僅無法滿足查詢時效性,且使用者還需要承擔資料彙集的鏈路穩定性風險及資料冗餘的經濟成本。
為了解決跨資料庫例項及時查詢的難題,阿里雲DMS(資料管理)推出了跨資料庫例項查詢服務

DMS跨資料庫查詢


一條SQL完成跨資料庫例項Join查詢


跨例項查詢服務支援通過標準SQL進行跨同異構資料庫的實時查詢。除了關係型資料庫MySQL、SQLServer、PostgreSQL,還支援Redis。同時,跨例項查詢服務還支援跨地域、跨雲及線下IDC自建資料庫及跨雲廠商資料庫例項間的資料實時查詢,被廣泛應用於多地域部署業務的全域性資料查詢場景。
本文以MySQL及Redis為例,介紹如何通過一條SQL輕鬆完成跨資料庫例項的查詢。

通過標準SQL查詢Redis

跨例項查詢服務支援通過SQL查詢Redis中的任意key,同時支援跨key之間的join查詢。在進行SQL查詢前,您需要先在跨例項查詢服務中,建立Redis例項的DBLink。接下來簡單介紹建立DBLink及進行SQL查詢的流程。

建立DBLink

在跨例項查詢服務的控制檯,建立DBLink,配置Redis例項的連線資訊。
當完成DBLink建立後,需要使用這個DBLink編寫查詢SQL。

通過SQL查詢Key

跨例項查詢服務提供WEB SQL命令視窗,可以直接在命令視窗中,通過標準的SQL進行Key查詢。具體支援的SQL命令可以參考使用文件。
對於每一個redis的database, DMS會自動建立6張表,分別如下:
all: 儲存所有的key
string: 儲存資料型別為string的可以
hash:儲存資料型別為hash的key
list: 儲存資料型別為list的key
set:儲存資料型別為set的key
zset:儲存資料型別為score set的key
每張表的表結構如下:

列名型別說明KeyVarcharRedis中的key名IndexVarchar當資料型別為list/zset時,為各個元素的index;當資料型別為hash時,改欄位為hash中的key名稱ValueVarcharKey的value值ScoreDouble表示SortedSet的分值,其他資料型別為nullExpire_timeBigint跟redis的ttl命令一致,表示資料離過期的剩餘秒數Data_typeVarchar這個key的資料型別

此處,我們通過通過如下的select語句查詢all表中的前5個key。
select * from redis_test.db0.all limit 5;

一條SQL完成跨資料庫例項Join查詢


跨MySQL&Redis Join查詢

日前接到某遊戲客戶跨MySQL及Redis查詢的需求。該客戶將使用者積分排行榜儲存在redis myzset中,而將使用者元資訊維護在MySQL user 表中。使用者的某個簡單訴求是:在遊戲APP中能實時重新整理使用者的積分排行榜。

資料結構

通過redis score set儲存使用者積分情況,儲存使用者ID及score, key的名稱為user_scrore, value為使用者ID, score為使用者積分。樣例資料如下表:

keyvaluescoreuser_score10010user_score20035user_score30045

通過MyQL User表儲存使用者的基本資訊,包括user_id, user_name,province, city, gmt_create等,其中:
User_id 為使用者ID, User_name 為使用者名稱
Province 為使用者所屬省份, city 為使用者所屬市
Gmt_create 為使用者第一次登陸游戲APP的時間
樣例資料如下表:

User_idUser_nameprovincecityGmt_create100張三浙江杭州2018-11-11 11:11:11200李四廣東省深圳2018-10-11 12:11:01

關聯查詢

通過如下SQL,可方便得查詢使用者的積分排行榜。
select user.user_name,zset.score from redis_test.db0.zset as zset join mysql.db0.user as user where
user.user_id=zset.value and zset.key='user_score' order by zset.score desc;
這個SQL將redis中的使用者ID跟MySQL中的user_id進行關聯,且只查詢儲存使用者積分的key。

小結

由於篇幅有限,本文只是簡單介紹了DMS 跨資料庫查詢的功能及其在Redis上的使用案例。


原文連結

本文為雲棲社群原創內容,未經允許不得轉載。


相關文章