mysql跨库查询 效率_教你用一条SQL搞定跨数据库查询难题
日前,某电商用户由于业务发展迅猛,访问量极速增长,导致数据库容量及性能遭遇瓶颈。为降低数据库大小,提升性能,用户决定对架构进行垂直拆分。根据不同的表来进行拆分,对应用程序的影响也更小,拆分规则也会比较简单清晰。
该用户按照会员、商品、订单,将数据垂直拆分至三个数据库,分库后数据分布到不同的数据库实例,以达到降低数据量,增加实例数的扩容目的。然而前途是美好的,道路是曲折的。一旦涉及拆分,就逃不开“原本在同一数据库里的查询,要变成跨两个数据库实例”的查询问题。
单库时,系统中很多列表和详情页所需数据可以简单通过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实现跨实例的交叉查询。
立即体验从SQL操作中,进入跨实例SQL窗口。
参考使用指南,创建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月
本文为云栖社区原创内容,未经允许不得转载。
mysql跨库查询 效率_教你用一条SQL搞定跨数据库查询难题相关推荐
- 教你用一条SQL搞定跨数据库查询难题
导读 日前,某电商用户由于业务发展迅猛,访问量极速增长,导致数据库容量及性能遭遇瓶颈.为降低数据库大小,提升性能,用户决定对架构进行垂直拆分.根据不同的表来进行拆分,对应用程序的影响也更小,拆分规则也 ...
- word论文排版插件_教你如何用word快速搞定论文排版
在疫情影响下,各大高校纷纷开启了远程指导论文/答辩,尽量不影响毕业时间.这不,前段时间湖北武汉科技大学的同学,利用视频在家顺利通过博士学位论文答辩.emmm,人家都答辩完半个月了,回头瞧瞧我们,论文排 ...
- 教你3招,彻底搞定OCR数学公式识别难题!
OCR技术现已广泛应用于金融.航天.教育.医疗等领域.商汤科技.旷视科技.云从科技.依图科技.百度.阿里.腾讯等大量科技公司都在高薪招聘相关人才. OCR任务的难题有很多,文字识别准确率的长尾效应.字 ...
- 数据库 字段长度_全美都在用的大型肿瘤数据库,教你用别人的数据搞定一篇SCI...
转载来源: 全美都在用的大型肿瘤数据库,教你用别人的数据搞定一篇SCI_辑思编译editideas.cn 今天介绍一个经典的肿瘤数据库-seer,它是北美最具代表性的大型肿瘤登记注册数据库之一,收集 ...
- 教你用 3 台机器搞定一个 Redis 高可用架构
转载自 教你用 3 台机器搞定一个 Redis 高可用架构 基于内存的 Redis 应该是目前各种 Web 开发业务中最为常用的 key-value 数据库了. 我们经常在业务中用其存储用户登陆态 ...
- 计算机无法上网的软件故障,解决你99%无法联网问题,高手教你只用1招轻松搞定...
原标题:解决你99%无法联网问题,高手教你只用1招轻松搞定 无限君:现在生活中不管是电脑还是手机,没有了网络绝大多数功能会无法使用,在日常生活中手机连接无线网的故障非常罕见,基本上通过手机重启就可以轻 ...
- 后台多条sql查询,json传前台,前台处理多条sql数据实例
后台多条sql查询,json传前台,前台处理多条sql数据实例 前台jsp页面: <div class="yppp_2" style="margin-left:10 ...
- java mysql单库多表_第69节:Java中数据库的多表操作
第69节:Java中数据库的多表操作 前言 学习数据库的多表操作,去电商行业做项目吧!!! 达叔,理工男,简书作者&全栈工程师,感性理性兼备的写作者,个人独立开发者,我相信你也可以!阅读他的文 ...
- java跨库join方案_集算器协助java处理多样性数据源之跨库关联
Java的数据计算类库RowSet提供了JoinRowSet和FilteredRowSet类,可以进行跨库的关联计算,但是有很多局限.首先,JoinRowSet只支持inner join,不支持out ...
- tableau跨库创建并集_刮擦柏林青年旅舍,并以此建立一个Tableau全景。
tableau跨库创建并集 One of the coolest things about making our personal project is the fact that we can ex ...
最新文章
- php错误提示如何查询,php-如何显示我的MySQLi查询错误?
- w10系统老是自动息屏_大师解答win10系统无法自动关屏/待机和睡眠的恢复教程
- 输出 1-100 内的所有奇数
- 就是把努力涂抹在人生的画卷上
- 来,拆一堆芯片看看!
- switch matlab c语言,matlab switch语句使用
- 数字滤波器(四)--模拟滤波器转化为数字滤波器
- log4j mysql 异步_spring boot:配置druid数据库连接池(开启sql防火墙/使用log4j2做异步日志/spring boot 2.3.2)...
- electronic-wechat高分屏下的缩放修改
- 云服务器磁盘挂载_云服务器快照是备份的吗?
- C++ MFC人事管理系统
- linux分段加载程序_Linux的分段机制
- 基金与私募基金概念解析:共同基金、单位信托、投资信托计划、券商集合理财、基金专户理财
- Java中对象方法的调用过程动态绑定(Dynamic Binding)
- SPSS详细操作:生存资料的Cox回归分析
- 数据结构-买卖青蛙最大利润
- Ubuntu下插入网线无法联网的问题
- 超硬核的Java工程师分享,什么是Java?为什么我要做Java,我是如何学习Java的?
- php文件如何转音频,如何转换音频文件,mp3格式转换器,音频格式转换器,
- pvr图片格式转png--shell脚本