Mysql数据库多表数据查询问题

1、背景

线上某个业务数据分表存储在10个子表中,现在需要快速按照条件(比如时间范围)筛选出所有的数据,主要是想做一个可视化的数据查询工具,给产研团队使用。

2、实践

注意:不要在线上真实数据库操作,操作前需要确认清楚。线上质量第一!线上质量第一!线上质量第一!

思路1使用UNION ALL操作符将这些子表合并,然后在合并后的结果集上执行查询操作。

假设现在有10个子表,命名为table_1, table_2, ..., table_10,并且每个表中都有一个表示时间的字段 timestamp_column,可以使用以下查询来按照时间范围筛选出所有的数据:

SELECT *
FROM (SELECT * FROM chat_message_1 WHERE send_time BETWEEN 'start_time' AND 'end_time'UNION ALLSELECT * FROM chat_message_2 WHERE send_time BETWEEN 'start_time' AND 'end_time'UNION ALL-- ...SELECT * FROM chat_message_10 WHERE send_time BETWEEN 'start_time' AND 'end_time'
) AS combined_tables;

在这个查询中,start_timeend_time是你想要的时间范围。UNION ALL操作符用于合并子表,然后在合并后的结果上执行查询操作。

请注意,这种方法可能在数据量很大的情况下导致性能问题,因为它会扫描并合并多个表。如果性能是一个重要的考虑因素,你可能需要考虑其他优化策略,例如分区表、分表查询等。

下面我们用"UNION ALL"仅查询4个表,时间范围为一周,我们看看数据库Mysql的CPU使用情况有什么变化。

SELECT * FROM (SELECT * FROM chat_message_1 WHERE send_time BETWEEN 1693843200000 AND 1694607993000UNION ALLSELECT * FROM chat_message_2 WHERE send_time BETWEEN 1693843200000 AND 1694607993000UNION ALLSELECT * FROM chat_message_3 WHERE send_time BETWEEN 1693843200000 AND 1694607993000UNION ALLSELECT * FROM chat_message_4 WHERE send_time BETWEEN 1693843200000 AND 1694607993000
) AS combined_tables;

数据库为双核CPU部署,可以看到CPU的占用从3%左右飙升到25%+,这个情况在线上的真实环境是绝对不能忍受的。

事实上,我们的真实场景比这个会更复杂,数据中每一条数据代表的是问题Q或者答案A,通过msg_id和question_id一一关联,最后实际需要展示的结果是QA对,如果按照上述“UNION”的方法查询,数据库CPU占用大概率会更高,不具备可行性。

数据库的结构

数据库中数据示例:

msg_idquestion_idmessage
10000你的姓名?
1000110000我叫张三。
10002你今年多大了?
1000310002我今年18岁。
......

最终期望查出来的数据结果是:(QA对)

msg_idqueryanswer
10000你的姓名?我叫张三。
10002你今年多大了?我今年18岁。

思路2基于编程语言的并发能力,通过并行请求数据库查询,也就是并行执行SQL语句。

此方法风险很大,不再赘述,对数据库压力较大,不是推荐的做法。事实上进过测试,数据库的CPU占用也很大。

3、思考&方案

刚开始的时候我们业务的数据量比较少,直接使用“UNION ALL”等操作查询速度也很快,突然有一天线上的数据库开始报警,提示CPU占用过高,影响了线上的部分业务,慌得一批。

线上真实的使用场景查询条件很多,也有对应的索引,一般是查询某个人的数据,而具体某个人的所有数据是可以通过约定好的算法算出他的数据存在于哪个固定的数据库的(分表的思路),因此并不会出现上述我们提到的查询语法场景,速度很快,不会有任何问题。

而我们原计划想做的可视化的数据查询工具,是想查所有的用户数据,因此会变得复杂很多,刚开始的思路其实也有点问题,想直接实时查询所有表所有人的数据。经过和我们的研发同学确认,他说实时查询不建议这么做,分表的目的就是为了在大数量的情况下减轻查询的压力实时查询和离线导全量数据的场景是不一样的,实时查询这种可以按表来查询,比如在页面上让用户主动选择 数据库(人工指定查哪个数据库),这种大概率就是数据抽样查看。

因此,最终我们做的实时数据查询可视化页面示例如下,让用户主动选择某个数据表进行查询。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/207931.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

zookeeper集群+kaafka集群

kafka3.0之前依赖于zookeeper zookeeper开源,分布式的架构,提供协调服务(Apache项目) 基于观察者模式涉及的分布式服务管理架构 存储和管理数据,分布式节点上的服务接受观察者的注册,一旦分布式节点上的…

【网络安全技术】消息认证技术

一、哈希函数 1.安全性质 1)抗第一原像攻击(Preimage Resistance) 给定哈希后的值,很难找到哈希前的原消息。这很好理解,需要哈希函数具有单向性。 一个简单的例子就是密码存储系统,用户登录服务器需要…

使用dirmap命令行时报错,提示缺少gevent模块

记得以前是可以的,可能是时间长了重装了系统,引起的。 修复方法。升级pip,然后重新下载安装gevent模块。 具体: 使用下面命令解决下载慢的问题。 pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple …

python中,or、not的用法

or的用法 在python中,or运算符是一个逻辑运算符,用于在多个条件中选择至少一个为真(True)的情况。 如果条件中的任意一个为真,整个表达式的结果就为真 如: 示例1: 检查两个数字中至少有一个正数 示例2: x True y …

使用系统ProgressBar实现三色进度条

使用系统ProgressBar实现如图三色进度条&#xff1a; //布局中<ProgressBarandroid:layout_width"0dp"android:layout_height"8dp"android:layout_marginLeft"16dp"app:layout_constraintBottom_toBottomOf"id/photo"app:layout_c…

Linux 权限管理

1 Linux 安全模型 AAA认证资源分派&#xff1a; 当用户登录时&#xff0c;系统会自动分配令牌 token&#xff0c;包括用户标识和组成员等等信息 1.1 用户 Linux 中每个用户是通过 User ID&#xff08;UID&#xff09;来唯一标识的。 1.2 用户组 Linux 中可以将一个或者多个…

OOM了?物理内存不够了?试试这个方法来提升内存容量,不花钱的

通过增加虚拟内存来提高内存使用 本文解决的实际问题&#xff1a; 当我们物理内存小的时候&#xff0c;会出现OOM&#xff0c;然后服务自动死掉的情况。因为物理内存大小是固定的&#xff0c;有没有其他好的办法来解决呢&#xff1f;这里我们可以适当调整Linux的虚拟内存来协作…

spring cloud gateway源码分析,一个请求进来的默认处理流程

1.前言 spring cloud gateway的基本组成和作用就不细赘述&#xff0c;此篇适合对此有一定了解的人阅读。 spring cloud gateway版本: Hoxton.SR1 spring cloud gateway的配置使用yml配置&#xff1a; server:port: 9527y#根据微服务名称进行动态路由的配置 spring:applicati…

【Amazon】通过代理连接的方式导入 AWS EKS集群至KubeSphere主容器平台

文章目录 一、设置主集群方式一&#xff1a;使用 Web 控制台方式二&#xff1a;使用 Kubectl命令 二、在主集群中设置代理服务地址方式一&#xff1a;使用 Web 控制台方式二&#xff1a;使用 Kubectl命令 三、登录控制台验证四、准备成员集群方式一&#xff1a;使用 Web 控制台…

linux上编写进度条

目录 一、预备的两个小知识1、缓冲区2、回车与换行 二、倒计时程序三、编写入门的进度条四、编写一个正式的五、模拟实现和下载速度相关的进度条 一、预备的两个小知识 1、缓冲区 首先认识一下缓冲区&#xff1a;先写一个.c文件如下&#xff1a; 我们执行一下这个程序时&…

如何在vs2019及以后版本(如vs2022)上添加 添加ActiveX控件中的MFC类

有时候我们在MFC项目开发过程中&#xff0c;需要用到一些微软已经提供的功能&#xff0c;如VC使用EXCEL功能&#xff0c;这时候我们就能直接通过VS2019到如EXCEL.EXE方式&#xff0c;生成对应的OLE头文件&#xff0c;然后直接使用功能&#xff0c;那么&#xff0c;我们上篇文章…

索尼PMW580视频帧EC碎片重组开启方法

索尼PMW580视频帧EC碎片重组开启方法 索尼PMW-580摄像机生成的MXF文件存在严重的碎片化&#xff0c;目前CHS零壹视频恢复程序MXF版、专业版、高级版已经支持重组结构体正常的碎片&#xff0c;同时也支持对于结构体破坏或者覆盖后仅存在音视频帧EC数据的重组&#xff0c;需要注…

次世代建模纹理贴图怎么做?

在线工具推荐&#xff1a; 三维数字孪生场景工具 - GLTF/GLB在线编辑器 - Three.js AI自动纹理化开发 - YOLO 虚幻合成数据生成器 - 3D模型在线转换 - 3D模型预览图生成服务 1、什么是次时代建模&#xff1f; "次世代建模"是一个术语&#xff0c;通常用来描述…

边缘数据中心和5G的融合彻底改变数据传输和物联网

伴随着数字化时代的飞速发展&#xff0c;边缘数据中心和5G技术的联袂崛起&#xff0c;正深刻塑造着人们对数据的创造、传输和处理方式。据Gartner公司的预测&#xff0c;到2025年&#xff0c;企业数据的三分之二将在边缘计算设施中涌现&#xff0c;而非传统的集中式数据中心。这…

抑郁症中西医治疗对比?

抑郁症是一种常见的心理障碍&#xff0c;治疗方法包括中医和西医两种。下面就抑郁症中西医治疗进行对比&#xff1a; 治疗方法&#xff1a;中医治疗抑郁症强调整体观念和辨证论治&#xff0c;通过调理身体各部分的功能&#xff0c;达到治疗抑郁症的目的。中医治疗抑郁症多采用天…

【数据结构】循环链表和双向链表

【循环链表】 (有头结点) pR1->next; R1->nextR2->next->next; free(R2->next); R2->nextp; 例&#xff1a;对于两个单循环链表a&#xff0c;b&#xff0c;将其连接起来&#xff0c;变成一个单循环链表 #include<stdio.h> #include<stdlib.h> …

【动态规划】LeetCode-62.不同路径

&#x1f388;算法那些事专栏说明&#xff1a;这是一个记录刷题日常的专栏&#xff0c;每个文章标题前都会写明这道题使用的算法。专栏每日计划至少更新1道题目&#xff0c;在这立下Flag&#x1f6a9; &#x1f3e0;个人主页&#xff1a;Jammingpro &#x1f4d5;专栏链接&…

数据结构:图文详解单链表的各种操作(头插法,尾插法,任意位置插入,删除节点,查询节点,求链表的长度,清空链表)

目录 一.什么是链表 二.链表的实现 节点的插入 头插法 尾插法 指定位置插入 节点的删除 删除第一次出现的关键字节点 删除所有关键字节点 节点的查找 链表的清空 链表的长度 前言&#xff1a;在上一篇文章中&#xff0c;我们认识了线性数据结构中的顺序表&#xff0…

K8s 中 Pod OOMKilled 原因

目录 Exit Code 137 解决方案 JVM 感知 cgroup 限制 使用 JDK9 的容器感知机制尝试 问题分析 容器内部感知 CGroup 资源限制 在 Java10 中&#xff0c;改进了容器集成 JVM 参数 MaxDirectMemorySize -XX:MaxDirectMemorySize 的默认值是什么&#xff1f; 其他获取 ma…

SQL server 2016安装

1、关系数据库的基本概念。 行&#xff1a;每行成为一条“记录”或“元组”&#xff0c;用于描述一个对象的信息。 列&#xff1a;每列称为一个“字段”或“属性”&#xff0c;用于描述对象的一个属性。 2、主键与外键。 主键&#xff1a;键&#xff0c;即关键字。主键由一个或…