mysql分表后的联合查询_MySQL分库分表分表后数据的查询(5th)

2023-10-31

前言

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

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

模拟场景

场景1:购买者下订单

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

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

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

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

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

— 获得导购分表信息,和所在门店

SELECT u.table_flag AS guide_flag,

ug.store_id AS store_id

FROM user AS u, user_guide AS ug

WHERE u.user_id = ug.user_id

AND user_guide_id = 导购ID;

SET autocommit=0;

START TRANSACTION;

— 创建销售订单 sell_order_2 通过程序拼凑出来的

INSERT INTO sell_order_2

VALUES(order_SnowflakeID, 导购ID, 购买者ID, 订单总额, 订单状态);

— 记录此订单有哪些商品

INSERT INTO order_goods_2

VALUES(order_goods_SnowflakeID, order_SnowflakeID, 商品ID, 商品价格, 商品个数);

— 记录购买订单表  buy_order_6 购买者所在的分表,上面的是出售者所在的分表别弄混了

— 购买者订单ID 和 出售者订单ID是一样的

INSERT INTO buy_order_6

VALUES(order_SnowflakeID, 用户ID, 导购ID)

COMMIT;

SET autocommit=1;

情况2:购买者浏览订单

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

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

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

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

— 获得用户的分表信息 user_id = 66

SELECT table_flag FROM user WHERE user_id=66;

+————+

| table_flag |

+————+

|          9 |

+————+

— 获取用户订单, 这些信息值直接先返回给浏览器的

SELECT * FROM buy_order_9 WHERE user_id=66 LIMIT 0, 1;

+———————+———+—————+

| buy_order_id        | user_id | user_guide_id |

+———————+———+—————+

| 3792111966815784961 |      66 |             1 |

+———————+———+—————+

— 获取 user_guide_id=1 用户的分表信息

SELECT u.table_flag AS guide_flag

FROM user AS u, user_guide AS ug

WHERE u.user_id = ug.user_id

AND user_guide_id = 1;

+————+

| guide_flag |

+————+

|          2 |

+————+

— 浏览器通过ajax获取商品信息进行展现

SELECT *

FROM order_goods_2

WHERE sell_order_id = 3792111966815784961

AND user_guide_id = 1;

+———————+———————+———————+—————+———+——+

| order_goods_id      | sell_order_id       | goods_id            | user_guide_id | price   | num  |

+———————+———————+———————+—————+———+——+

| 3792112143781859329 | 3792111966815784961 | 3792111950445416449 |             1 | 3100.00 |    2 |

| 3792112160789762049 | 3792111966815784961 | 3792111951305248769 |             1 | 5810.00 |    1 |

+———————+———————+———————+—————+———+——+

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

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

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

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

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

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

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

情况3:导购查看订单

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

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

— 获得导购的分表信息 user_id = 6, user_guide_id = 5

SELECT table_flag FROM user WHERE user_id=6;

+————+

| table_flag |

+————+

|          6 |

+————+

— 查询订单信息

SELECT * FROM sell_order_6 WHERE user_guide_id = 5 LIMIT 0, 3;

+———————+—————+———+———+——–+

| sell_order_id       | user_guide_id | user_id | price   | status |

+———————+—————+———+———+——–+

| 3792112033412943873 |             5 |      10 | 5197.00 |      1 |

| 3792112033429721089 |             5 |      10 | 6826.00 |      1 |

| 3792112033446498305 |             5 |      10 | 5765.00 |      1 |

+———————+—————+———+———+——–+

— 查询订单商品信息

SELECT * FROM order_goods_6

WHERE sell_order_id IN(

3792112033412943873,

3792112033429721089,

3792112033446498305

);

+———————+———————+———————+—————+———+——+

| order_goods_id      | sell_order_id       | goods_id            | user_guide_id | price   | num  |

+———————+———————+———————+—————+———+——+

| 3792112273532653569 | 3792112033412943873 | 3792111951800176641 |             5 | 7826.00 |    1 |

| 3792112292964864001 | 3792112033412943873 | 3792111952559345665 |             5 | 3057.00 |    2 |

| 3792112273545236481 | 3792112033429721089 | 3792111952660008961 |             5 | 8540.00 |    1 |

| 3792112292981641217 | 3792112033429721089 | 3792111951863091201 |             5 | 8545.00 |    1 |

| 3792112273566208001 | 3792112033446498305 | 3792111952110555137 |             5 | 8383.00 |    2 |

| 3792112292998418433 | 3792112033446498305 | 3792111952966193153 |             5 | 3282.00 |    2 |

+———————+———————+———————+—————+———+——+

情况4:导购修改订单

1

2

— 修改订单价格

UPDATE sell_order_6 SET price = 1000.00 WHERE sell_order_id = 3792112033412943873;

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

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

1

2

3

4

5

6

7

8

9

— 获得店主的分表信息 user_id = 1

SELECT table_flag FROM user WHERE user_id=1;

+————+

| table_flag |

+————+

|          2 |

+————+

— 店主添加商品

INSERT INTO goods_2 VALUES(SnowflakeID, 商品名称, 商品价格, 门店ID);

文章转载来自:ttlsa.com

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

mysql分表后的联合查询_MySQL分库分表分表后数据的查询(5th) 的相关文章

  • The NVIDIA driver on your system is too old (found version 10000)

    问题 原因是因为CUDA版本与pytorch版本不匹配 解决办法 查看自己的CUDA版本 我的是CUDA 10 0 https pytorch org 把这行复制到Anaconda Prompt窗口就行了
  • CPU虚拟化

    CPU虚拟化 中央处理器 CPU 是计算机的主要设备之一 是计算机中的核心配件 在计算机体系结构中 CPU是对计算机的所有硬件资源 如存储器 输入输出单元 进行控制调配 执行通用运算的核心硬件单元 计算机系统中所有软件层的操作 最终都将通过
  • @ControllerAdvice 的介绍及三种用法

    学习下 ControllerAdvice 首先 ControllerAdvice本质上是一个 Component 因此也会被当成组建扫描 加了 ControllerAdvice的类为那些声明了 ExceptionHandler InitBi
  • IP地址分类(A类 B类 C类 D类 E类)

    IP地址由四段组成 每个字段是一个字节 8位 最大值是255 IP地址由两部分组成 即网络地址和主机地址 网络地址表示其属于互联网的哪一个网络 主机地址表示其属于该网络中的哪一台主机 二者是主从关系 IP地址的四大类型标识的是网络中的某台主
  • 如何完美解答面试问题——HashMap的扩容机制(JDK1.7)

    大家好 我是孤焰 今天要谈一谈在面试过程中几乎被每个面试官都会提到的一个问题 HashMap的扩容机制是什么 由于我也是刚刚学习编程的小白 所以此篇博文将参考了多篇博文 最后总结而成 此篇博文仅介绍JDK1 8版本之前的HashMap扩容机
  • Unity3D 动画操作

    导入模型 https blog csdn net shenqiankk article details 100064940 方式一 Animator animation SetBool 状态转换的参数 true false 在创建对象前 先
  • 【计算机网络】数据链路层(一):数据帧和物理寻址

    数据链路层是物理层的上层 物理层是把电脑连接起来的物理手段 它主要规定了网络的一些电气属性 其作用是负责传送0和1的电信号 数据链路层位于物理层的上层 简单的阐述它的作用就是确定0和1的分组方式 下面我们就详细的介绍数据链路层 上面是TCP
  • 阿里云DNS 新增云上线路的智能解析功能

    简介 企业在云上部署单元化架构或内部服务链路时 需要考虑让数据 单元 离用户更近 避免跨单元获取数据 以此来满足自身低延时的诉求 阿里云DNS 新增基于云上链路的调度功能 进一步优化DNS智能解析 给云上用户提供更精准的流量调度能力 传统解
  • 基于STM32串口通信的ESP8266WiFi模块使用

    掌握esp8266的使用可以实现真正的万物物联 esp8266wifi通信对于MCU而言归结到底还是串口或spi通信 因此 掌握RS232通信协议 SPI通信协议以及esp8266的配置就可以基本搞定WiFi模块的使用 参考文章 1 ESP
  • 安全帽佩戴检测算法模型训练详细流程

    一 任务描述 实际施工现场需要对每个进出的人员进行安全帽监测 对未佩戴安全帽的人员平台进行风险告警 通知工作人员并记录下来 主要包括三类目标物体 头盔 helmet 人 person 和人头 head 二 实现流程 1 数据集 直接用的网络
  • C++I/O输入输出

    1 流和缓冲区 我们通常说的流 可以理解为从一个地方流向另一个地方 在C 中的I O是指的输入 输出端口 那么I O流就可以简单的理解为在外部设备和内存之间的数据流动 直白的讲 流实际上是一个字节序列 即 字节流 而C 程序把输入输出看做字
  • WIN11修改右键菜单默认展开

    想要展开右键菜单 像Windows 10那样 首先打开Terminal写入注册表项 展开 reg exe add HKCU Software Classes CLSID 86ca1aa0 34aa 4e8b a509 50c905bae2a
  • JAVA中的数据结构和底层原理

    JAVA中的数据结构简述 JAVA中常用的数据结构主要有这样几种分类 List 可存储相同的值 确切讲是a equals b 时 二者都可存储 我们会挑选适宜连续存储的ArrayList和链式存储的LinkedList进行介绍 Set 不可
  • 数据结构-leetcode-环形链表

    解题图解 代码如下 bool hasCycle struct ListNode head struct ListNode fast head 在这里fast是快指针 head作为low指针 因为这个题不需要做修改也只需返回true或fals
  • Web API

    文章目录 Web API基本认知 获取DOM元素 根据Css选择器来获取DOM元素 其它获取DOM元素方法 操作元素内容 操作元素属性 常用属性 元素样式属性 表单元素属性 定时器 间歇函数 定时器 延时函数 事件监听 事件类型 事件对象
  • RV1126_RV1109从设备树中读取native-mode节点信息流程

    1 video of display timing c struct display timings of get display timings 在该函数中获取native mode节点信息 返回值就是获取到的timing 下步查看谁调用
  • 时序预测

    时序预测 MATLAB实现基于PSO BiLSTM BiLSTM时间序列预测对比 目录 时序预测 MATLAB实现基于PSO BiLSTM BiLSTM时间序列预测对比 效果一览 基本描述 程序设计 参考资料 效果一览 基本描述 MATLA
  • Shiro实战学习笔记(4)- 整合springboot(1)

    1 shiro整合spring boot gt
  • 恒玄BES2300XX系列常用接口(2)

    hal cmu sys reboot 复位 hal norflash disable protection HAL NORFLASH ID 0 flash闪存禁用保护 define ANC MODE SWITCH WITHOUT FADE

随机推荐

  • vue脚手架、npm、node

    vue cli vue脚手架 cli gt command line interface 命令行界面 vue脚手架可以快速 安全的构建vue项目 vue cli 脚手架 需要使用npm cnpm包管理工具进行安装 npm npm是一种js语
  • C++ 一行代码删除string字符串中的“\n“、“\r“、“\t“ 和 所有空白字符

    这篇博客记录如何删除C 字符串中的回车 换行 制表符和所有的空白字符 方式一 示例 std string str n r t abc n t r cba r t n std cout lt lt str lt lt std endl 运行截
  • Websocket握手

    当客户端想要使用 WebSocket 协议与服务端进行通信时 首先需要确定服务端是否支持 WebSocket 协议 因此 WebSocket 协议的第一步是进行握手 WebSocket 握手采用 HTTP Upgrade 机制 客户端可以发
  • gpio子系统在sysfs中构建leds类

    1 内核配置 CONFIG GPIO SYSFS y CONFIG GPIOLIB y 1 CONFIG GPIO SYSFS 决定sysfs是否支持gpio子系统 也就是能否在 sys class 目录下看到gpio类 2 CONFIG
  • lua静态检查

    最近接了个组内的项目 代码是lua开发 由别的人写好 我进行调试 没想到呀 代码写完竟然都没有静态检查 到处都是坑 天了噜 程序员最怕的是什么 填坑呀 还是填别人的坑 没办法 只好一个一个的把坑填上 填完坑 不禁想问 难道写完代码 静态检查
  • Basic Level 1094 谷歌的招聘 (20分)

    题目 2004 年 7 月 谷歌在硅谷的 101 号公路边竖立了一块巨大的广告牌 如下图 用于招聘 内容超级简单 就是一个以 com 结尾的网址 而前面的网址是一个 10 位素数 这个素数是自然常数 e 中最早出现的 10 位连续数字 能找
  • redis设置密码加密

    修改redis conf的配置文件 映射或者禁止一些高危命令 后面为空即为禁止 rename command FLUSHALL rename command CONFIG rename command EVAL eg rename comm
  • uniapp中uni-load-more的使用

    1 引入uniloadmore import uniLoadMore from components uni load more uni load more vue components uniLoadMore 2 data中写的内容 re
  • MySQL遇到错误:1217 - Cannot delete or update a parent row: a foreign key constraint fails

    遇到问题 今天在准备 删库跑路 的时候 有的数据表再删除的时候报了以下错误 1217 Cannot delete or update a parent row a foreign key constraint fails 本着有事找度娘的原
  • 设计模式之中介者模式

    中介者模式 1 项目需求 设计一个智能家庭 家庭中包括各种设备 比如闹钟 咖啡机 电视机 窗帘等 完成各个设备之间的协同工作 假设流程为 闹钟响起 gt 咖啡机开始做咖啡 gt 窗帘自动落下 gt 电视机开始播放 这次项目的需求和外观模式一
  • 使用Python,OpenCV进行卡类型及16位卡号数字的OCR

    使用Python OpenCV进行卡类型及16位卡号数字的OCR 1 效果图 2 原理 2 1 OCR A字体 2 2 检测过程步骤 2 3 优化 3 源代码 参考 这篇博客将介绍如何通过OpenCV和Python使用模板匹配执行光学字符识
  • mysql 表级锁之读锁、写锁

    语法 lock tables tablename read write或 lock table tablename read write 表级锁 读锁 当MySQL的一个进程为某一个表开启读锁之后 其他的进程包含自身都没有权利去修改这个表的
  • Advanced Leve 1005 Spell It Right (20 point(s))

    Theme Given a non negative integer N your task is to compute the sum of all the digits of N and output every digit of th
  • CDH6.3.2之Kerberos安全认证

    问题导读 1 Kerberos认证原理是什么 2 Kerberos如何部署 3 CDH集群如何启用Kerberos 4 如何在Kerberos安全环境使用HFDS 01 PART Kerberos简介 Kerberos是一种计算机网络授权协
  • 2、怎么对printf重定向的?

    原文见这篇文章 以及这篇 调试代码时 需要将需要的信息发送到串口 这就要对printf进行重定向 正点原子的重定向代码如下 printf打印串口函数 if 1 pragma import use no semihosting 标准库需要的支
  • STM32cubeMX配置工程(全过程+修改MCU方法+注意事项)

    1 修改默认的固件包下载路径 避免占用C盘空间 2 选择ACCESS TO MCU 3 在跳出的界面中的Part Number中搜索对应的芯片型号 4 选好后在右下角双击对应的芯片 然后跳出配置界面 左边可以配置外设 右边可以配置每个IO口
  • srand()和rand()函数详解

    头文件 C语言
  • React入门第一天(绑定事件,动态渲染,修改样式、传参)

    案例一 绑定事件 动态渲染 import React Component from react export default class App extends Component constructor props super props
  • 打造酷炫RecyclerView 进入 item动画效果

    参考链接 点击这里
  • mysql分表后的联合查询_MySQL分库分表分表后数据的查询(5th)

    前言 在分表完之后显然对于数据的查询会变的比较的复杂 特别是在表的关联方面 在有些情况下根本就不能使用JOIN 其实个人是比较鼓励将那些大的JOIN SQL拆分成几个小的SQL来查询数据 这样虽然总体的效率可能会稍稍下降 如果使用了连接池完