开发者社区> lyrewu> 正文
阿里云
为了无法计算的价值
打开APP
阿里云APP内打开

一条SQL完成跨数据库实例Join查询

简介: 本文以MySQL及Redis为例,介绍如何通过一条SQL轻松完成跨数据库实例的查询。
+关注继续查看

背景

随着业务复杂程度的提高、数据规模的增长,越来越多的公司选择对其在线业务数据库进行垂直或水平拆分,甚至选择不同的数据库类型以满足其业务需求。原本在同一数据库实例里就能实现的SQL查询,现在需要跨多个数据库实例才能完成。业务的数据被“散落”在各个地方,如何方便地对这些数据进行汇总关联查询,已经成为困扰用户的一大难题。
针对这类问题,传统的解决方案需要用户提前将所有实例的数据提前汇集到汇总库进行查询分析。这种方案不仅无法满足查询时效性,且用户还需要承担数据汇集的链路稳定性风险及数据冗余的经济成本。
为了解决跨数据库实例及时查询的难题,阿里云DMS(数据管理)推出了跨数据库实例查询服务

DMS跨数据库查询

image
跨实例查询服务支持通过标准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
每张表的表结构如下:

列名 类型 说明
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;
image

跨MySQL&Redis Join查询

日前接到某游戏客户跨MySQL及Redis查询的需求。该客户将用户积分排行榜存储在redis myzset中,而将用户元信息维护在MySQL user 表中。用户的某个简单诉求是:在游戏APP中能实时刷新用户的积分排行榜。

数据结构

通过redis score set存储用户积分情况,存储用户ID及score, key的名称为user_scrore, value为用户ID, score为用户积分。样例数据如下表:

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的时间
样例数据如下表:

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。

小结

由于篇幅有限,本文只是简单介绍了DMS 跨数据库查询的功能及其在Redis上的使用案例。您可以立即体验跨数据库实例查询>>
跨数据库查询的详细功能及使用场景可以参考:使用文档
教你用一条SQL搞定跨数据库查询:如何玩转跨库Join

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
软件测试最常用的 SQL 命令 | 通过实例掌握基本查询、条件查询、聚合查询
软件测试最常用的 SQL 命令 | 通过实例掌握基本查询、条件查询、聚合查询
0 0
SQL CREATE TABLE 实例
SQL CREATE TABLE 实例
0 0
SQL CREATE VIEW 实例
SQL CREATE VIEW 实例
0 0
SQL MID() 实例
SQL MID() 实例
0 0
SQL GROUP BY 实例
SQL GROUP BY 实例
0 0
SQL TOP 实例
SQL TOP 实例
0 0
SQL TOP PERCENT 实例
SQL TOP PERCENT 实例
0 0
SQL SELECT * 实例
SQL SELECT * 实例
0 0
SQL SELECT 实例
SQL SELECT 实例
0 0
SQL UNION 实例
SQL UNION 实例
0 0
+关注
lyrewu
专注数据库领域产品输出。
文章
问答
文章排行榜
最热
最新
相关电子书
更多
用SQL做数据分析
立即下载
阿里云流计算 Flink SQL 核心功能解密
立即下载
Comparison of Spark SQL with Hive
立即下载