一條SQL完成跨數據庫實例Join查詢

背景

隨着業務複雜程度的提升、數據規模的增加,愈來愈多的公司選擇對其在線業務數據庫進行垂直或水平拆分,甚至選擇不一樣的數據庫類型以知足其業務需求。本來在同一數據庫實例裏就能實現的SQL查詢,如今須要跨多個數據庫實例才能完成。業務的數據被「散落」在各個地方,如何方便地對這些數據進行彙總關聯查詢,已經成爲困擾用戶的一大難題。
針對這類問題,傳統的解決方案須要用戶提早將全部實例的數據提早聚集到彙總庫進行查詢分析。這種方案不只沒法知足查詢時效性,且用戶還須要承擔數據聚集的鏈路穩定性風險及數據冗餘的經濟成本。
爲了解決跨數據庫實例及時查詢的難題,阿里雲DMS(數據管理)推出了跨數據庫實例查詢服務html

DMS跨數據庫查詢

跨實例查詢服務支持經過標準SQL進行跨同異構數據庫的實時查詢。除了關係型數據庫MySQL、SQLServer、PostgreSQL,還支持Redis。同時,跨實例查詢服務還支持跨地域、跨雲及線下IDC自建數據庫及跨雲廠商數據庫實例間的數據實時查詢,被普遍應用於多地域部署業務的全局數據查詢場景。
本文以MySQL及Redis爲例,介紹如何經過一條SQL輕鬆完成跨數據庫實例的查詢。mysql

經過標準SQL查詢Redis

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

建立DBLink

在跨實例查詢服務的控制檯,建立DBLink,配置Redis實例的鏈接信息。
當完成DBLink建立後,須要使用這個DBLink編寫查詢SQL。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
每張表的表結構以下:數據庫

列名 類型 說明
Key Varchar Redis中的key名
Index Varchar 當數據類型爲list/zset時,爲各個元素的index;當數據類型爲hash時,改字段爲hash中的key名稱
Value Varchar Key的value值
Score Double 表示SortedSet的分值,其餘數據類型爲null
Expire_time Bigint 跟redis的ttl命令一致,表示數據離過時的剩餘秒數
Data_type Varchar 這個key的數據類型

此處,咱們經過經過以下的select語句查詢all表中的前5個key。
select * from redis_test.db0.all limit 5;數據結構

跨MySQL&Redis Join查詢

日前接到某遊戲客戶跨MySQL及Redis查詢的需求。該客戶將用戶積分排行榜存儲在redis myzset中,而將用戶元信息維護在MySQL user 表中。用戶的某個簡單訴求是:在遊戲APP中能實時刷新用戶的積分排行榜。阿里雲

數據結構

經過redis score set存儲用戶積分狀況,存儲用戶ID及score, key的名稱爲user_scrore, value爲用戶ID, score爲用戶積分。樣例數據以下表:spa

key value score
user_score 100 10
user_score 200 35
user_score 300 45

經過MyQL User表存儲用戶的基本信息,包括user_id, user_name,province, city, gmt_create等,其中:
User_id 爲用戶ID, User_name 爲用戶名
Province 爲用戶所屬省份, city 爲用戶所屬市
Gmt_create 爲用戶第一次登錄遊戲APP的時間
樣例數據以下表:htm

User_id User_name province city Gmt_create
100 張三 浙江 杭州 2018-11-11 11:11:11
200 李四 廣東省 深圳 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。blog

小結

因爲篇幅有限,本文只是簡單介紹了DMS 跨數據庫查詢的功能及其在Redis上的使用案例。您能夠當即體驗跨數據庫實例查詢>>
跨數據庫查詢的詳細功能及使用場景能夠參考:使用文檔
教你用一條SQL搞定跨數據庫查詢:如何玩轉跨庫Join

 



本文做者:lyrewu

原文連接

本文爲雲棲社區原創內容,未經容許不得轉載。

相關文章
相關標籤/搜索