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

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

partitionkey普通查询

partitionkey上的IN查询

非partitionkey上的查询

有限功能的排序+分页查询

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

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

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

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

partitionkey上的简单查询

WHEREkey=xxxANDxxx

partitionkey上的IN查询

WHEREkeyIN(xxx,yyy)ANDxxx

非partitionkey上的简单查询

WHEREnotkey=xxxANDxxx

排序+分页的需求

ORDERBYxxxOFFSETxxxLIMITxxx

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

建立索引表以避免遍历库再内部排序

使用额外的id查询条件来避免大数据量的查询

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

夸库join

夸库事务

夸库子查询

其他奇形怪状的SQL

二、搜索研发部调研

从搜索研发部高级架构师

longc处了解到,暂时没有数据库分库需求。

画外音:

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

三、即时通讯部调研

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

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

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

画外音:

玄姐设计的系统,架构考虑得极其完善。

四、移动研发部调研

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

五、架构部调研

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

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

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

方式一

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

当业务方不需要







































北京那家医院治疗白癜风好啊
有地方能治好白癜风吗



转载请注明:http://www.xcqg58.com/pxxx/8047.html

  • 上一篇文章:
  •   
  • 下一篇文章: 没有了