导读

日前,某电商用户由于业务发展迅猛,访问量极速增长,导致数据库容量及性能遭遇瓶颈。为降低数据库大小,提升性能,用户决定对架构进行垂直拆分。根据不同的表来进行拆分,对应用程序的影响也更小,拆分规则也会比较简单清晰。

该用户按照会员、商品、订单,将数据垂直拆分至三个数据库,分库后数据分布到不同的数据库实例,以达到降低数据量,增加实例数的扩容目的。然而前途是美好的,道路是曲折的。一旦涉及拆分,就逃不开“原本在同一数据库里的查询,要变成跨两个数据库实例”的查询问题

单库时,系统中很多列表和详情页所需数据可以简单通过SQL join关联表查询;而拆库后,拆分后的数据可能分布在不同的节点/实例上,不能跨库使用join,此时join带来的问题就很棘手了。


例如:业务中需要展示某个品类商品的售卖订单量,现在订单数据和商品数据分布在两个独立的数据库实例中,业务上要怎么进行关联查询?

用户首先想到的方法是,对现有业务代码进行重构,分别从两个数据库查询数据,然后在业务代码中进行join关联。那么问题来了,如果采用这个解决方案,业务上那么多查询改造起来,拆分难度极大,操作起来过于复杂。跨库join操作又没有非常高效的办法,需要各个分库迭代查询,查询效率也会有一定影响。

是不是光想想就一个头两个大?别担心,关于数据库拆分后的业务改造难题,其实用一条SQL就可轻松搞定。具体解法如下⬇️

解决思路

经沟通,我们发现用户遇到的其实就是典型的跨数据库实例查询问题。目前,阿里云DMS已经支持跨数据库实例SQL查询的能力,用户可以通过DMS,利用一条SQL即可解决上述难题。不仅能够满足“跨库Join”这一核心诉求,还能极大地简化用户的技术方案。



除了开篇介绍的客户案例,DMS跨数据库实例的查询功能可以解决我们业务中遇到的任意跨数据库查询的诉求。例如:跨线上库及历史库的join查询,快速获取全量数据;单元化架构下,join各个单元的数据库查询全局数据;游戏业务,可以join MySQL中的用户数据及MongoDB中的游戏装备数据等。

接下来,我们通过一个快速上手的实例,来看看用户如何写这条SQL。

商品库的信息

实例连接:198.12.13.1:3306 , 数据库名:seller
商品表名:commodity
包含部分字段的表结构:

create table commondity(
id BIGINT(20),  -- 商品ID
name varchar(100), -- 商品名称
create_time TIMESTAMP ,  -- 商品入库时间
catogary BIGINT(30), -- 商品类目
features text,  -- 商品描述
param text); -- 商品属性

订单库的信息

实例连接:198.12.13.2:3306 , 数据库名:buyer
订单表表名:order_list
包含部分字段的表结构:单态)

create table order_list(
id BIGINT(20),  -- 订单ID
buyer_id BIGINT(30), -- 买家ID
create_time TIMESTAMP ,  -- 订单生成时间
seller_id BIGINT(30), -- 卖家ID
commodity_id BIGINT(30), -- 商品ID
status int(8) – 

创建DBLink

在编写查询SQL之前,需要先在DMS中配置卖家库和买家库的DBLink。

编写并运行跨库查询SQL

当DBLink配置完成后,即可开始在DMS中编写并运行SQL,实现查询某个商品的订单列表的需求。

SELECT comomndity.catogary,count(1)from buyer_db.buyer.order_list
order,seller_db.seller.commondity commondity
where order.commodity_id= commondity.id
GROUP BY commondity.catogary;

这个SQL的语法完全兼容MySQL,只是在From的表名前面带上DBLink。
所以,业务方只需要使用DMS跨数据库查询SQL便可轻松解决拆库之后的跨库查询难题,业务基本无需改造。

什么是DMS跨数据库查询

SELECT * FROM oracle.dsqltest.b oracle inner join

mysql.dsqltest.a mysql on oracle.id = mysql.id 
WHERE oracle.id=1

DMS提供的跨数据库实例查询功能孵化于阿里巴巴集团,目前已服务超过5000名开发者,全面支撑阿里巴巴跨数据库实例的所有线上查询需求。DMS支持跨同异构数据库的在线查询,支持MySQL、SQLServer、PostgreSQL及Redis等数据源,为应用提供了一种数据全局查询的能力。用户无需通过数据汇集,即可通过标准SQL实现跨实例的交叉查询。

立即体验

  1. 请先登录DMS控制台。
  2. 从SQL操作中,进入跨实例SQL窗口。
  3. 创建DBlink,编写并运行SQL。

阿里云双十一1折拼团活动:满6人,就是最低折扣了!
【满6人】1核2G云服务器99.5元一年298.5元三年 2核4G云服务器545元一年 1227元三年
【满6人】1核1G MySQL数据库 119.5元一年
【满6人】3000条国内短信包 60元每6月
参团地址:http://click.aliyun.com/m/1000020293/

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

教你用一条SQL搞定跨数据库查询难题相关推荐

  1. 教你3招,彻底搞定OCR数学公式识别难题!

    OCR技术现已广泛应用于金融.航天.教育.医疗等领域.商汤科技.旷视科技.云从科技.依图科技.百度.阿里.腾讯等大量科技公司都在高薪招聘相关人才. OCR任务的难题有很多,文字识别准确率的长尾效应.字 ...

  2. Sql Server 2005跨数据查询

    在进行Sql Server 2005跨数据库查询时,有时会出现排序规则不一致,且选出来的内容是乱码的问题. 临时解决方法,将一个库中的表中的数据导入到另一个库中,将跨数据库查询变成同数据库查询. 转载 ...

  3. 计算机无法上网的软件故障,解决你99%无法联网问题,高手教你只用1招轻松搞定...

    原标题:解决你99%无法联网问题,高手教你只用1招轻松搞定 无限君:现在生活中不管是电脑还是手机,没有了网络绝大多数功能会无法使用,在日常生活中手机连接无线网的故障非常罕见,基本上通过手机重启就可以轻 ...

  4. 教你用 3 台机器搞定一个 Redis 高可用架构

    转载自   教你用 3 台机器搞定一个 Redis 高可用架构 基于内存的 Redis 应该是目前各种 Web 开发业务中最为常用的 key-value 数据库了. 我们经常在业务中用其存储用户登陆态 ...

  5. CentOS各版本更换国内源,一条指令搞定,超简单!

    CentOS各版本更换国内源,一条指令搞定,超简单! 前言 CentOS 有个很方便的软件安装工具yum,但是默认安装完CentOS,系统里使用的是国外的CentOS更新源,这就造成了我们使用默认更新 ...

  6. MD5值计算方法,推荐使用linux系统计算,一条命令搞定!

    一.MD5是什么? MD5是message-digest algorithm 5(信息-摘要算法)的缩写,被广泛用于加密和解密技术上,它可以说是文件的"数字指纹". 任何一个文件, ...

  7. 三条命令搞定Winload.exe出现0xc000000e错误

    三条命令搞定Winload.exe出现0xc000000e错误 File: /Windows/system32/winload.exe Status: 0xc000000e 解决办法是: 使用WinP ...

  8. 数据库 字段长度_全美都在用的大型肿瘤数据库,教你用别人的数据搞定一篇SCI...

    转载来源: 全美都在用的大型肿瘤数据库,教你用别人的数据搞定一篇SCI_辑思编译​editideas.cn 今天介绍一个经典的肿瘤数据库-seer,它是北美最具代表性的大型肿瘤登记注册数据库之一,收集 ...

  9. 强化学习快餐教程(3) - 一条命令搞定atari游戏

    强化学习快餐教程(3) - 一条命令搞定atari游戏 通过上节的例子,我们试验出来,就算是像cartpole这样让一个杆子不倒这样的小模型,都不是特别容易搞定的. 那么像太空入侵者这么复杂的问题,建 ...

最新文章

  1. Unity视觉效果图初学教程 Unity Visual Effects Graph for Beginners
  2. 图文详解 23 种设计模式
  3. Python全栈开发之路 【第六篇】:Python基础之常用模块
  4. java实现二进制转16进制
  5. Open Asset Import Library
  6. PowerDesigner的文章
  7. 基站建设(三元环计数+根号分治 / bitset)
  8. [渝粤教育] 广东-国家-开放大学 21秋期末考试Java程序设计基础10232k2
  9. 解决VMware6.5 以上版本安装RHEL 5的自动安装的问题
  10. 5元以下纯铜小摆件_【拍4斤发5斤】早餐饼干网红早餐代餐曲奇酥性小饼干零食500g6元优惠券券后价5.8元...
  11. 1. 搭建scapy
  12. MySQL存储过程(五)——存储过程查看、删除和修改
  13. Linux 程序运行时报错:找不到库文件[cannot open shared object file: No such file or directory ```](转载)
  14. 深入理解Scala 标识符,命名和域
  15. 爬虫入门—网页信息爬取
  16. 【LaTex编译遇到问题】!pdfTeX error: pdflatex (file simhei.ttf): cannot open TrueType font file for reading
  17. 用交叉网线连接两台电脑的局域网
  18. Weighted Boxes Fusion
  19. 饥荒联机版steam专用服务器创建
  20. 《惢客创业日记》2019.04.25(周四)如何解决骚扰电话?

热门文章

  1. java彩票案例_java彩票例子
  2. python实现数据恢复软件_pyinstaller还原python代码过程图解
  3. linux 休眠定时唤醒_Linux重启关机命令经验之谈
  4. 派生类构造的时候一定要调用_没钱的时候,一定要记住这三个教训
  5. ios 裁剪圆形头像_iOS开发之裁剪圆形头像
  6. php 加载redise_PHP Redis扩展无法加载的问题解决方法
  7. a jni error has occurred_A-08 幂函数、有理函数、代数函数
  8. 你愿意隐姓埋名一辈子吗?
  9. 2020年平均工资出炉!这个行业最高
  10. 这所985大学决定:404名硕博研究生,退学处理!