一条SQL完成跨数据库实例Join查询
发布日期:2021-08-30 16:01:54 浏览次数:9 分类:技术文章

本文共 2194 字,大约阅读时间需要 7 分钟。

背景

随着业务复杂程度的提高、数据规模的增长,越来越多的公司选择对其在线业务数据库进行垂直或水平拆分,甚至选择不同的数据库类型以满足其业务需求。原本在同一数据库实例里就能实现的SQL查询,现在需要跨多个数据库实例才能完成。业务的数据被“散落”在各个地方,如何方便地对这些数据进行汇总关联查询,已经成为困扰用户的一大难题。

针对这类问题,传统的解决方案需要用户提前将所有实例的数据提前汇集到汇总库进行查询分析。这种方案不仅无法满足查询时效性,且用户还需要承担数据汇集的链路稳定性风险及数据冗余的经济成本。
为了解决跨数据库实例及时查询的难题,阿里云DMS(数据管理)推出了。

DMS跨数据库查询

跨实例查询服务支持通过标准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;

跨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上的使用案例。

本文为云栖社区原创内容,未经允许不得转载。

转载于:https://juejin.im/post/5cac55026fb9a068583513be

转载地址:https://blog.csdn.net/weixin_34038652/article/details/91484833 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:快速体验 Sentinel 集群限流功能,只需简单几步
下一篇:Java springboot B2B2C o2o多用户商城 springcloud架构(四)断路器(Hystrix)

发表评论

最新留言

不错!
[***.144.177.141]2024年03月14日 14时09分59秒

关于作者

    喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!

推荐文章

kali远程登录window_Windows系统远程连接,多人同时远程且互不影响 2019-04-21
嵌入式系统串口解析二进制数_适合嵌入式stm32的五大操作系统解析 2019-04-21
天正lisp文件路径_天正3.0 软件包+安装教程 2019-04-21
可由线性表示且表达式唯一_用“辗转相除法”将两数的最大公因数表成两数的线性组合... 2019-04-21
安装 终止pip_Open-falcon-基础系列(二)-安装与部署(单机版) 2019-04-21
vscode启动项目报jdk11没有_如果Visual Studio太大,不妨还是用VSCode开发C#项目吧 2019-04-21
的i2c例子_I2C协议与EEPROM 2019-04-21
函数传参字典_Python基础之函数编写与传参方式 2019-04-21
获取input数据_时间序列数据建模流程范例 2019-04-21
创建多线程_Java多线程创建方式 2019-04-21
插入公式_插入数学公式快捷方式 2019-04-21
绘制三线表_R|tableone 快速绘制文章“表一”-基线特征三线表 2019-04-21
实体框架ef基于什么_论ORM之EFCore初篇(快速基于本地数据库实现数据操作) 2019-04-21
里面有面和点_面点师分享几种常见商用配方,解密行业不为人知的秘密 2019-04-21
双千兆和双频千兆哪个好_双频路由器和单频路由器哪个好【详细介绍】 2019-04-21
laravel 图片流_基于laravel,一个下载远程图片到本地, 返回 MD5的方法 2019-04-21
python powershell库_PowerShell封装了Python for .NET实现从PowerShell调用Python 2019-04-21
弹力弹珠java_弹球游戏 - java代码库 - 云代码 2019-04-21
qbytearray类型_QByteArray类 2019-04-21
wxpython 按钮跳notebook_wx.Notebook的应用 2019-04-21