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

news2024/11/24 7:27:59

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 ALL
    SELECT * 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 1694607993000
    UNION ALL
    SELECT * FROM chat_message_2 WHERE send_time BETWEEN 1693843200000 AND 1694607993000
    UNION ALL
    SELECT * FROM chat_message_3 WHERE send_time BETWEEN 1693843200000 AND 1694607993000
    UNION ALL
    SELECT * 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.coloradmin.cn/o/1258758.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【JavaEE初阶】 博客系统项目--前端页面设计实现

文章目录 🌲主要内容🎍预期效果🚩博客列表页效果🚩博客详情页🚩博客登录页🚩博客编辑页 🍀实现博客列表页🚩实现导航栏🎈页面主体部分 🎄实现博客详情页&…

无公网IP环境如何实现远程访问连接家里内网的威联通QNAP NAS

🌷🍁 博主猫头虎(🐅🐾)带您 Go to New World✨🍁 🦄 博客首页——🐅🐾猫头虎的博客🎐 🐳 《面试题大全专栏》 🦕 文章图文…

JAVA进阶之路JVM-1:jvm基本组成、java程序执行过程、java程序的跨平台、静态编译器、jvm执行方式

JVM基本组成 当线上系统突然宕机,系统无法访问,甚至直接OOM; 线上系统响应速度太慢,优化系统性能过程中发现CPU占用过高,原因也许是因为JVM的GC次数过于频繁 因此,新项目上线,需要设置JVM的各…

高精度基准电压源测试方法有哪些

高精度基准电压源是一种能够产生稳定、可控的电压信号的设备,广泛应用于科学研究、工业检测和仪器仪表校准等领域。为了保证电压信号的准确性和可靠性,在使用高精度基准电压源进行测试时,需要采取一系列的测试方法和技术手段。 校准和验证是使…

软著项目推荐 深度学习 植物识别算法系统

文章目录 0 前言2 相关技术2.1 VGG-Net模型2.2 VGG-Net在植物识别的优势(1) 卷积核,池化核大小固定(2) 特征提取更全面(3) 网络训练误差收敛速度较快 3 VGG-Net的搭建3.1 Tornado简介(1) 优势(2) 关键代码 4 Inception V3 神经网络4.1 网络结构 5 开始训练5.1 数据集…

AIGC文生图及工具产品简介

AIGC,全称是人工智能生成内容(Artificial Intelligence Generated Content)是继UGC(用户生成内容),PGC(平台生成内容)后,利用人工智能技术,自动生成内容的生产…

无mac电脑生成uniapp云打包私钥证书的攻略

uniapp顾名思义是一个跨平台的开发工具,大部分uniapp的开发者,其实并没有mac电脑来开发,但是生成ios的证书,官网的教程却是需要mac电脑的,那么有没有办法无需mac电脑即可生成uniapp云打包的私钥证书呢? 下…

深入理解计算机中的程序

目录 程序的存储 程序的编译过程 各位宝宝好&#xff0c;我们这次从计算机底层来讲一下程序是如何存储&#xff0c;编译的 程序的存储 我们拿一个最简单的程序来举个例子&#xff1a; #include<stdio.h> int main() {printf("hello world");return 0; } …

吐血整理,Jmeter性能测试常见问题+解决汇总(详细)

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 1、request 请求超…

【好书推荐-第30期】开发者请注意!因果推断与机器学习,终于有人能讲明白啦!

本文目录 一、因果推断二、因果推断的前世今生三、总结四、赠书条件 今天给各位读者推荐一本好书&#xff1a;《机器学习高级实践&#xff1a;计算广告、供需预测、智能营销、动态定价》&#xff0c;好书链接。 2023年初是人工智能爆发的里程碑式的重要阶段&#xff0c;以Open…

Linux MeterSphere一站式开源持续测试平台远程访问

文章目录 前言1. 安装MeterSphere2. 本地访问MeterSphere3. 安装 cpolar内网穿透软件4. 配置MeterSphere公网访问地址5. 公网远程访问MeterSphere6. 固定MeterSphere公网地址 前言 MeterSphere 是一站式开源持续测试平台, 涵盖测试跟踪、接口测试、UI 测试和性能测试等功能&am…

C++ 红黑树插入详解

前言 在之前&#xff0c;我们学习了AVL树&#xff0c;知道了AVL树是一个平衡二叉搜索树&#xff0c;如果没学过AVL树&#xff0c;这篇文章看起来会很吃力&#xff0c;不清楚如何旋转的&#xff0c;建议可以先看AVL树的内容。 今天我们要学习的红黑树&#xff0c;他也是一颗平衡…

串口通信 HAL库+cubeMX

一.通信的基本概念 1.串行通信和并行通信 2.全双工、半双工和单工 3.针对串行通信的同步通信和异步通信 4.通信速率 二.UART配置 UART常用HAL库函数 //UART_HandleTypeDef *huart是句柄typedef struct {//初始化看前面两个就可以了USART_TypeDef *Instance; /* UART 寄存器…

软件提示vcruntime140_1.dll文件丢失解决方法,和vcruntime140_1.dll丢失原因分析

vcruntime140_1.dll是Visual C Redistributable Packages的一部分&#xff0c;它是Microsoft Visual C 2015 Update 3运行时库文件。它包含了许多C标准库函数的实现&#xff0c;这些函数在运行使用C编写的程序时会被调用。所以我们在打开运行软件时候如果计算机中的vcruntime14…

(十三)Flask之特殊装饰器详解

目录&#xff1a; Flask中用作装饰器的特殊的函数第一部分&#xff1a;before_request和after_request一、 before_request装饰器&#xff1a;二、after_request装饰器&#xff1a;三、多个before_request和after_request执行流程分析&#xff1a; 首先—理论讲解&#xff1a;然…

Java核心知识点整理大全18-笔记

Java核心知识点整理大全-笔记_希斯奎的博客-CSDN博客 Java核心知识点整理大全2-笔记_希斯奎的博客-CSDN博客 Java核心知识点整理大全3-笔记_希斯奎的博客-CSDN博客 Java核心知识点整理大全4-笔记-CSDN博客 Java核心知识点整理大全5-笔记-CSDN博客 Java核心知识点整理大全6…

沈阳陪诊系统|陪诊软件开发功能

陪诊小程序的出现它可以帮助患者或家属解决就医过程中的各种问题。根据数据显示&#xff0c;2021年中国陪诊市场规模约为36.7亿元&#xff0c;预计到2025年将达到100亿元。同时&#xff0c;在医疗行业数字化转型的大背景下&#xff0c;陪诊微信小程序作为一种创新的医疗服务模式…

ABAP: JSON 报文解析——/ui2/cl_json

1、JSON数组 报文格式如下&#xff0c;是JSON 数组类型的。 [{"I_TYPE":"V","I_BUSINESSSCOPE":"1001"},{"I_TYPE":"V","I_BUSINESSSCOPE":"1002"} ] json转换为SAP内表&#xff1a; TYP…

二 使用GPIO的复用功能 利用USART 实现printf()

参考这篇&#xff1a; STM32串口通信详解 1. 关于USART USART ( universal synchronous / asynchronous receiver /transmitter) 是一种串行通讯协议 , 允许设备通过串行端口进行数据传输&#xff0c; USART 能够以同步或者异步的方式进行工作&#xff0c;在实际的运用中&…

机器学习的复习笔记4-岭回归与多项式回归

一、岭回归 在简单的线性回归中&#xff0c;一味追求平方误差最小化&#xff0c;R2值尽可能大&#xff0c;可能会受到噪声的严重干扰。噪声&#xff0c;即偶发的错误的值。 如图&#xff0c;若为满足所有点的拟合&#xff08;虚线&#xff09;&#xff0c;表面上看R2值小&…