数据库中间件为何不支持join

本文涉及的产品
服务治理 MSE Sentinel/OpenSergo,Agent数量 不受限
云原生网关 MSE Higress,422元/月
注册配置 MSE Nacos/ZooKeeper,118元/月
简介: 一切脱离业务的架构设计,都是耍流氓。

有网友对《假如让你来设计数据库中间件》一文中,数据库中间件仅仅支持四类SQL存有疑问:

  • partition key普通查询
  • partition key上的IN查询
  • 非partition key上的查询
  • 有限功能的排序+分页查询

这四类SQL就能满足公司业务的需求么,这个结论是怎么来的?

看来《假如让你来设计数据库中间件》的架构结论并不能让刨根究底的网友们满意,于是把13年底,需求调研的过程细节也说一说,作为一个一线架构师,治学还是得严谨。

一、业务侧的分库后SQL需求

先说结论,通过初步的调研,发现58各业务线对有分库需求的应用场景为:

  • partition key上的简单查询

WHERE key=xxx AND xxx

  • partition key上的IN查询

WHERE key IN(xxx, yyy) AND xxx

  • 非partition key上的简单查询

WHERE notkey=xxx AND xxx

  • 排序+分页的需求

ORDER BY xxx OFFSET xxx LIMIT xxx

大部分需求集中在前三条,排序+分页的需求由于分布式实现困难,各业务线往往也采用了一些限制或者变通手段实现,例如:

  • 建立索引表以避免遍历库再内部排序
  • 使用额外的id查询条件来避免大数据量的查询

调研结果显示,各业务线暂没有下列需求:

  • 夸库join
  • 夸库事务
  • 夸库子查询
  • 其他奇形怪状的SQL

二、搜索研发部调研

从搜索研发部高级架构师@longc 处了解到,暂时没有数据库分库需求。

画外音:@龙神 做搜索内核,压根瞧不起我这个用MySQL搞业务的人呀。

三、即时通讯部调研

和@sunx 进行了沟通,帮帮技术部没有水平分库,只有水平分表,业务需求为常见需求中的“partition key上的普通查询”。

对于58帮帮的“用户登陆表”,数据量较大,目前分为32个表,以uid作为partition key,所有的查询都会带上partition key,故可以直接定位到数据所属的partition。

image.png

如上例,假设58帮帮对某数据量较大的表以id为partition key分了3个表,上游的所有查询都会带上id=xxx这个查询条件(当然,亦可以同时带上其他查询条件)。

画外音:@玄姐 设计的系统,架构考虑得极其完善。

四、移动研发部调研

从@liunz 了解到,无线分库使用场景和帮帮技术部类似,都是“partition key 上的普通查询”。

五、架构部调研

从@liuzw 了解到,架构部在imc,umc等服务使用水平分库,业务需求为常见需求中的“patition key 上的普通查询”,“partition key上的IN查询”,“非partition key上的查询”。

image.png

对于“partition key上的IN查询”,架构部采用的是将各个partition key定位到相关的库,最后将查询结果集汇总,再返回上游的方式来实现。注意,如上图所示,带partition key的IN查询并不一定会遍历所有的库。

对于“非partition key上的查询”,根据不同的业务,架构部有两种处理方式:

方式一

业务方不需要精确数据,随机取一个库的数据,即可满足业务方要求,例如“查询10个有头像的用户”

当业务方不需要关注结果集的精确性时,可以随机取一个库查询。

画外音:这是一个很好的设计,典型的“根据业务需求确定技术方案”的good case。

image.png

方式二

业务方需要精确数据,就必须遍历所有的库,例如“查询用户名为shenjian的用户”。

image.png

画外音:uid的生成没有采用“基因法”,非常遗憾。关于“基因法”的方案详见《单KEY业务,数据库水平切分架构实践 | 架构师之路》。

六、会员技术部调研

从@wangzt 了解到,会员技术部使用水平分库,调研结论里对分库的四种SQL需求在业务中都有用到。

对“非partition key上的查询”,除了使用架构部使用的全库查询方案,会员技术部还是用了冗余数据法来解决这个问题:

image.png

这种查询方式使用冗余数据来避免全库查询,缺点是可能存在数据一致性问题。

“夸库分页查询”,会员技术部的处理方式是索引表:

image.png

使用订单分库,买家的查询查询索引表,索引表的本质也是冗余。

画外音:关于“帖子业务的水平切分”的方案详见《1对多业务,数据库水平切分架构一次搞定 | 架构师之路》。

七、支付平台部调研

从@hudp 了解到,分库的数据访问,货币系统部所有的线上实时业务都必须携带partition key,故其访问模式和即时通讯的数据访问模式相同。

但对于支撑系统/统计需求,在分库数据上,他们计划引入cobar来解决他们的问题。

八、前端业务部调研

从@wangjk 了解到,前端业务部这边,四种分库SQL都有,对于夸库分页,前端业务部这边的业务上要求必须带上一个特殊的id作为where字段,以避免拉取大量的数据重新排序。

image.png

九、结论

58如果要做数据库中间件,一期支持四类SQL:

  • partition key普通查询
  • partition key上的IN查询
  • 非partition key上的查询
  • 有限功能的排序+分页查询

能够满足业务线绝大部分分库的需求。

一切脱离业务的架构设计,都是耍流氓。

末了:看到调研文档里熟悉的名字,眼泪不知不觉的流下来,兄弟们,你们还好吗?

目录
相关文章
|
SQL Oracle 关系型数据库
解决:Oracle数据库中Left join on 后面为null时匹配不上
解决:Oracle数据库中Left join on 后面为null时匹配不上
338 0
|
7月前
|
缓存 负载均衡 监控
探秘数据库中间件:ProxySQL与MaxScale的优势与劣势
探秘数据库中间件:ProxySQL与MaxScale的优势与劣势
258 2
|
3月前
|
运维 监控 安全
【YashanDB知识库】ycm托管数据库时报错OM host ip:127.0.0.1 is not support join to YCM
总之,解决“OM host ip: 127.0.0.1 is not supported to join to YCM”的关键在于理解集群管理对IP地址的使用要求,并据此做出相应的配置调整,确保集群的稳定性和数据一致性。
29 1
|
3月前
|
关系型数据库 数据挖掘 数据库
解析数据库联结:应用与实践中的 INNER JOIN、LEFT JOIN、RIGHT JOIN、FULL OUTER JOIN 与 CROSS JOIN
解析数据库联结:应用与实践中的 INNER JOIN、LEFT JOIN、RIGHT JOIN、FULL OUTER JOIN 与 CROSS JOIN
96 1
|
5月前
|
SQL 数据挖掘 数据库
数据库join类型有哪些?
【8月更文挑战第2天】
182 17
数据库join类型有哪些?
|
5月前
|
运维 安全 Cloud Native
核心系统转型问题之分布式数据库和数据访问中间件协作如何解决
核心系统转型问题之分布式数据库和数据访问中间件协作如何解决
|
7月前
|
缓存 NoSQL 中间件
应对数据库不断膨胀的数据:缓存和队列中间件
【6月更文挑战第5天】该文探讨了优化数据库使用以提升应用系统性能的策略。文中建议利用Redis缓存和MQ消息队列作为辅助工具,以进一步优化性能和减少资源消耗。
239 2
应对数据库不断膨胀的数据:缓存和队列中间件
|
6月前
|
中间件 Java 测试技术
单元测试问题之编写单元测试时运行环境、数据库、中间件问题如何解决
单元测试问题之编写单元测试时运行环境、数据库、中间件问题如何解决
|
6月前
|
SQL 中间件 关系型数据库
MyCAT数据库中间件的架构与使用方法
MyCAT数据库中间件的架构与使用方法
|
8月前
|
缓存 监控 中间件
中间件Cache-Aside策略应用程序直接与缓存和数据库进行交互
【5月更文挑战第8天】中间件Cache-Aside策略应用程序直接与缓存和数据库进行交互
96 4