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

本文涉及的产品
RDS Agent(兼容OpenClaw),2核4GB
RDS MySQL DuckDB 分析主实例,基础系列 4核8GB
RDS DuckDB + QuickBI 企业套餐,8核32GB + QuickBI 专业版
简介: 本文以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

相关实践学习
如何快速连接云数据库RDS MySQL
本场景介绍如何通过阿里云数据管理服务DMS快速连接云数据库RDS MySQL,然后进行数据表的CRUD操作。
目录
相关文章
|
9月前
|
SQL 机器学习/深度学习 人工智能
从“写SQL”到“聊数据”:NL2SQL如何用自然语言解锁数据库?
本文系统性地阐述了自然语言转SQL(NL2SQL) 技术如何让非技术背景的业务分析师实现数据自助查询,从而提升数据驱动决策的效率与准确性。
从“写SQL”到“聊数据”:NL2SQL如何用自然语言解锁数据库?
|
8月前
|
关系型数据库 MySQL 数据库
自建数据库如何迁移至RDS MySQL实例
数据库迁移是一项复杂且耗时的工程,需考虑数据安全、完整性及业务中断影响。使用阿里云数据传输服务DTS,可快速、平滑完成迁移任务,将应用停机时间降至分钟级。您还可通过全量备份自建数据库并恢复至RDS MySQL实例,实现间接迁移上云。
|
8月前
|
SQL 监控 关系型数据库
一键开启百倍加速!RDS DuckDB 黑科技让SQL查询速度最高提升200倍
RDS MySQL DuckDB分析实例结合事务处理与实时分析能力,显著提升SQL查询性能,最高可达200倍,兼容MySQL语法,无需额外学习成本。
|
8月前
|
SQL 存储 关系型数据库
MySQL体系结构详解:一条SQL查询的旅程
本文深入解析MySQL内部架构,从SQL查询的执行流程到性能优化技巧,涵盖连接建立、查询处理、执行阶段及存储引擎工作机制,帮助开发者理解MySQL运行原理并提升数据库性能。
|
8月前
|
SQL 人工智能 Linux
SQL Server 2025 RC1 发布 - 从本地到云端的 AI 就绪企业数据库
SQL Server 2025 RC1 发布 - 从本地到云端的 AI 就绪企业数据库
668 5
SQL Server 2025 RC1 发布 - 从本地到云端的 AI 就绪企业数据库
|
7月前
|
SQL 存储 监控
SQL日志优化策略:提升数据库日志记录效率
通过以上方法结合起来运行调整方案, 可以显著地提升SQL环境下面向各种搜索引擎服务平台所需要满足标准条件下之数据库登记作业流程综合表现; 同时还能确保系统稳健运行并满越用户体验预期目标.
368 6
|
8月前
|
SQL 监控 关系型数据库
SQL优化技巧:让MySQL查询快人一步
本文深入解析了MySQL查询优化的核心技巧,涵盖索引设计、查询重写、分页优化、批量操作、数据类型优化及性能监控等方面,帮助开发者显著提升数据库性能,解决慢查询问题,适用于高并发与大数据场景。
|
9月前
|
SQL XML Java
通过MyBatis的XML配置实现灵活的动态SQL查询
总结而言,通过MyBatis的XML配置实现灵活的动态SQL查询,可以让开发者以声明式的方式构建SQL语句,既保证了SQL操作的灵活性,又简化了代码的复杂度。这种方式可以显著提高数据库操作的效率和代码的可维护性。
515 18
|
9月前
|
SQL 人工智能 Java
用 LangChain4j+Ollama 打造 Text-to-SQL AI Agent,数据库想问就问
本文介绍了如何利用AI技术简化SQL查询操作,让不懂技术的用户也能轻松从数据库中获取信息。通过本地部署PostgreSQL数据库和Ollama模型,结合Java代码,实现将自然语言问题自动转换为SQL查询,并将结果以易懂的方式呈现。整个流程简单直观,适合初学者动手实践,同时也展示了AI在数据查询中的潜力与局限。
1163 8
|
7月前
|
SQL 关系型数据库 MySQL
(SQL)SQL语言中的查询语句整理
查询语句在sql中占了挺大一部分篇幅,因为在数据库中使用查询语句的次数远多于更新与删除命令。而查询语句比起其他语句要更加的复杂,可因为sql是数据库不可或缺的一部分,所以即使不懂,也必须得弄懂,以上。
396 0