mysql跨库查询效率_教你⽤⼀条SQL搞定跨数据库查询难题⽇前,某电商⽤户由于业务发展迅猛,访问量极速增长,导致数据库容量及性能遭遇瓶颈。为降低数据库⼤⼩,提升性能,⽤户决定对架构进⾏垂直拆分。根据不同的表来进⾏拆分,对应⽤程序的影响也更⼩,拆分规则也会⽐较简单清晰。
该⽤户按照会员、商品、订单,将数据垂直拆分⾄三个数据库,分库后数据分布到不同的数据库实例,以达到降低数据量,增加实例数的扩容⽬的。然⽽前途是美好的,道路是曲折的。⼀旦涉及拆分,就逃不开“原本在同⼀数据库⾥的查询,要变成跨两个数据库实例”的查询问题。
单库时,系统中很多列表和详情页所需数据可以简单通过SQL join关联表查询;⽽拆库后,拆分后的数据可能分布在不同的节点/实例上,不能跨库使⽤join,此时join带来的问题就很棘⼿了。
例如:业务中需要展⽰某个品类商品的售卖订单量,现在订单数据和商品数据分布在两个独⽴的数据库实例中,业务上要怎么进⾏关联查询?
⽤户⾸先想到的⽅法是,对现有业务代码进⾏重构,分别从两个数据库查询数据,然后在业务代码中进⾏join关联。那么问题来了,如果采⽤这个解决⽅案,业务上那么多查询改造起来,拆分难度极⼤,操作起来过于复杂。跨库join操作⼜没有⾮常⾼效的办法,需要各个分库迭代查询,查询效率也会有⼀定影响。
mongodb和mysql结合是不是光想想就⼀个头两个⼤?别担⼼,关于数据库拆分后的业务改造难题,其实⽤⼀条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_der_list
order,
seller_db.sellermondity commondity
where ordermodity_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⽉
本⽂为云栖社区原创内容,未经允许不得转载。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论