一条SQL完成跨数据库实例Join查询
背景
随着业务复杂程度的提高、数据规模的增长,越来越多的公司选择对其在线业务数据库进行垂直或水平拆分,甚至选择不同的数据库类型以满足其业务需求。原本在同一数据库实例里就能实现的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
每张表的表结构如下:
| 列名 | 类型 | 说明 |
|---|---|---|
| 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为用户积分。样例数据如下表:
| 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
本文作者:lyrewu
本文为云栖社区原创内容,未经允许不得转载。
一条SQL完成跨数据库实例Join查询的更多相关文章
- 如何玩转跨库Join?跨数据库实例查询应用实践
背景 随着业务复杂程度的提高.数据规模的增长,越来越多的公司选择对其在线业务数据库进行垂直或水平拆分,甚至选择不同的数据库类型以满足其业务需求.原本在同一数据库实例里就能实现的SQL查询,现在需要跨多 ...
- [转] sql server 跨数据库调用存储过程
A库存储过程: create PROCEDURE [dbo].[spAAAForTest] ( ) =null , ) =null ) AS BEGIN select N'A' AS a , N'B' ...
- sql server 跨数据库调用存储过程
A库存储过程: create PROCEDURE [dbo].[spAAAForTest] ( ) =null , ) =null ) AS BEGIN select N'A' AS a , N'B' ...
- sql sever跨数据库复制数据的方法【转】
1,用Opendatasource系统函数 详细的用法已经注释在sql代码中了.这个是在sqlserver到sqlserver之间的倒数据.2005,2008,2012应该都是适用的. --从远程服务 ...
- SQL Server 跨数据库查询
语句 SELECT * FROM 数据库A.dbo.表A a, 数据库B.dbo.表B b WHERE a.field=b.field "DBO"可以省略 如 SELECT * F ...
- [Oracle]跨DBLINK的JOIN查询的数据库缓存问题15783452141
客户问到跨DBLINK,结合本地表和远端表的时候,数据在哪一边 的 Data Buffer 缓存. 测试的结果是:本地表在本地缓存,远端表在远端缓存. ####Testcase-0929-10 本地数 ...
- sql sever跨数据库复制数据的方法
1,用Opendatasource系统函数 详细的用法已经注释在sql代码中了.这个是在sqlserver到sqlserver之间的倒数据.2005,2008,2012应该都是适用的. --从远程服务 ...
- 如何查看SQL Server的数据库实例名
其实一般默认就是MSSQLSERVER (注意,就是英文大写). 点击开始,运行,services.mcs 然后查阅所有SQL Server的项,其中括号中字符串的就是实例名 reference: ...
- SQL Server跨数据库 增删查改
比如你在库A ,想查询库B的表.可以用 数据库名.架构名.表名的方式查询 select * from 数据库B.dbo.表1 也可以在存储过程中这样使用. 需要注意的是,如果使用这样的查询方式,你必须 ...
随机推荐
- SQLServer-SQLServer2017:安装 SQL Server 的硬件和软件要求
ylbtech-SQLServer-SQLServer2017:安装 SQL Server 的硬件和软件要求 1.返回顶部 1. 安装 SQL Server 的硬件和软件要求 2018/11/06 适 ...
- mysql基本笔记之一
1.创建数据库 CREATE DATABASE admin 2.查看数据库 SHOW DATABASES 3.使用数据库 USE admin 4.创建user表 CREATE TABLE user V ...
- Java 线程池 +生产者消费者+MySQL读取300 万条数据
1.1需求 数据库300 万条用户数据 ,遍历获取所有用户, 各种组合关联, 获取到一个新的json ,存到redis 上. 1.2 难点 数据库比较多, 不可能单线程查询所有的数据到内存. 1.3解 ...
- jmeter参数化之配置元件CSV控件
1. 用badboby进行录制,录制完成后保存,用JMeter格式进行保存,如:登陆.jmx 2. 在jmeter中打开保存的文件登陆.jmx. 3. 对登陆账号和密码进行参数 ...
- 批量操作文本文件进行dos/unix格式转换
批量将目录下所有文件进行 dos/unix 格式转换 使用 sed + grep #sed -i "s/原字符串/新字符串/g" `grep 原字符串 -rl 所在目录` eg: ...
- Qt运行不出现界面
安装Qt之后按照例程运行,结果不出现界面,原因是路径中有中文,将中文全部改成英文之后,问题解决.
- Django项目:CRM(客户关系管理系统)--41--33PerfectCRM实现King_admin编辑整张表限制
readonly_table=False#默认表单不锁定 readonly_table=True#默认表单不锁定 # forms.py # ————————19PerfectCRM实现King_adm ...
- ajax--表单带file数据提交报错Uncaught TypeError: Illegal invocation
只要设置 contentType: false, //不设置内容类型 processData: false, //不处理数据 $("#btn").on("click&qu ...
- python邮件发送:普通文本、html、添加附件
# -*- coding: utf-8 -*- # @Time : 2019/9/19 13:46 # @Author : HuangWenjun # @Email : 350920551@qq.co ...
- ucore os 前初始化
BIOS 初始化完成说起 连接的时候指定了 -Ttext 0x7c00 也指定了 -e start 所以booasm.S 中的start 就呗钦定为程序入口了. 开始就是 屏蔽中断 初始化段寄存器 使 ...