MySQL分库分表分表后数据的查询(5th)

  • A+
所属分类:MySQL

前言

在分表完之后显然对于数据的查询会变的比较的复杂,特别是在表的关联方面,在有些情况下根本就不能使用JOIN。

其实个人是比较鼓励将那些大的JOIN SQL拆分成几个小的SQL来查询数据。这样虽然总体的效率可能会稍稍下降(如果使用了连接池完全可以忽略),但是查询的语句变简单了,使得后续的维护带来的方便。同时也能带来比较便利的扩展。你可以感受一下有一个100行的SQL语句给你维护,和给你10个10行并且每一块都有很好的注释的SQL去维护,去帮助调优。你愿意选哪个。不管你们信不信,反正我是选第二种,而且第二种可以很好的理解业务。

上面说到要拆分JOIN,我的意思不是将每个语句都拆分。我的准则是 O(n) 次的查询。忌讳那种查出数据后通过程序循环查出结果再去数据库中查询,也就是需要 O(n*M)这种。 瞬间感觉方法论很重要有木有 ^_^。

模拟场景

  • 场景1:购买者下订单

1、在浏览商品的时候能获得商品的 门店ID 和 商品ID,至于导购ID这里我们能以随机的形式得到(需要根据业务来确定如何获取导购ID)

2、通过导购ID获得导购的用户信息从而得到导购的数据应该放在那张分表。

3、将下单数据存入出售者的分表,和购买者的分表。

下面展示的是伪代码(因为只用SQL不好展示具体业务逻辑),其实是自己比较懒不想写Python了。^_^

  • 情况2:购买者浏览订单

浏览购买者订单就是比较麻烦的,因为购买者订单信息和商品信息不是在同一分表中。

1、分页查找出购买者的订单列表。

2、将订单信息返回给浏览器后,使用ajax获取每个订单的商品。

从上面的试验我们可以看到原本在 '分库分表(1)--基础表介绍' 中的关联查询就能获得出订单的数据现在需要被拆为多个部分来查询(是不可避免的, 这样做也未必不是好事)。

 

这里说一下我们为什么要使用ajax来获取并展现 '订单商品' 的数据:

1、我们不知道 '购买订单' 的导购的分表是哪一个,因此我们需要便利查询出的每一条 '购买订单',如果有10个订单就需要便利10次去获取对应导购是哪个分表。

2、获得分表完之后还需要通过每个分表去关联 '订单商品' 获得商品信息。

3、获得到以上信息或需要整合成一个列表返回给浏览器。

通过上面一次性把说有数据返回给浏览器的方法,会影响到用户体验,让用户觉得很慢的感觉。并且需要写复杂的逻辑,难以维护。

我们将查询时间放大,一个查是 1s 如果有10个订单 一次性完成就可能需要 11s 以上的时间才返回给浏览器。如果先将查询的订单返回给浏览器。看上去就只需要 1s就吧数据返回给浏览器了。

  • 情况3:导购查看订单

导购也是一个普通用户, 因此一登陆系统就知道 导购ID 和 用户ID

  • 情况4:导购修改订单

  • 情况5:店主为店铺添加商品

添加商品只有店铺的店主有权限。然而店主也是一个普通用户。

如有疑问请跟帖说明。

 

感觉本文内容不错,读后有收获?

逛逛衣服店,鼓励作者写出更好文章。

weinxin
微信公众号
扫一扫关注运维生存时间公众号,获取最新技术文章~
HH

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

目前评论:2   其中:访客  2   博主  0

    • 呵呵 9

      ^_^ 所以标题是重复了吗

      • 艾米 9

        ^_^ 所以标题是重复了吗