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 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占用过高,影响了线上的部分业务,慌得一批。

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

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

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

使用Docker compose方式安装Spug,并结合内网穿透实现远程访问

文章目录 前言1. Docker安装Spug2 . 本地访问测试3. Linux 安装cpolar4. 配置Spug公网访问地址5. 公网远程访问Spug管理界面6. 固定Spug公网地址 前言 Spug 面向中小型企业设计的轻量级无 Agent 的自动化运维平台,整合了主机管理、主机批量执行、主机在线终端、文件…

【Docker】python flask 项目如何打包成 Docker images镜像 上传至阿里云ACR私有(共有)镜像仓库 集成Drone CI

一、Python环境编译 1、处理好venv环境 要生成正常的 requirements.txt 文件,我们就需要先将虚拟环境处理好 创建虚拟环境(可选): 在项目目录中,你可以选择使用虚拟环境,这样你的项目依赖将被隔离在一个…

3D点云目标检测:VoxelNex解读(带源码/未完)

VoxelNext 通用vsVoxelNext一、3D稀疏卷积模块1.1、额外的两次下采样1.2、稀疏体素删减 二、高度压缩三、稀疏池化四、head五、waymo数据集训练六、训练自己的数据集bug修改 通用vsVoxelNext 一、3D稀疏卷积模块 1.1、额外的两次下采样 使用通用的3D sparse conv,…

多线激光三维重建

交流联系点击:联系方式

人工智能学习2(python数据清洗)

编译工具:PyCharm 一.数据清洗 转化数据类型、处理重复数据、处理缺失数据 import pandas as pddf pd.read_csv("/data.csv") df.sample(10) # 用于随机获取数据并返回结果 df.head(10) # 查看前十条数据 df.tail(10) # 查看后十条数据 df.shape …

RK3568 android11 实现双路I2C触摸 --gt9xx

一,GT911 触摸屏简介 它的接口类型为 I2C ,供电电压和通讯电压均为 3.3V 。这款电容触摸屏内置了上拉电阻,这意味着我们的开发板上与该触摸屏的接口处不需要设置上拉电阻。关于线序,同样是 GT911 ,不同批次的器件都有…

从0开始学习JavaScript--JavaScript对象继承深度解析

JavaScript中的对象继承是构建灵活、可维护代码的关键部分。本文将深入讨论JavaScript中不同的继承方式,包括原型链继承、构造函数继承、组合继承等,并通过丰富的示例代码展示它们的应用和差异。通过详细解释,大家可以更全面地了解如何在Java…

vulfocus apache-cve_2021_41773 漏洞复现

vulfocus apache-cve_2021_41773 漏洞复现 名称: vulfocus/apache-cve_2021_41773 描述: Apache HTTP Server 2.4.49、2.4.50版本对路径规范化所做的更改中存在一个路径穿越漏洞,攻击者可利用该漏洞读取到Web目录外的其他文件,如系统配置文件、网站源码…

IDEA中也能用postman了?

Postman是大家最常用的API调试工具,那么有没有一种方法可以不用手动写入接口到Postman,即可进行接口调试操作?今天给大家推荐一款IDEA插件:Apipost Helper,写完代码就可以调试接口并一键生成接口文档!而且还…

修改mysql的密码(每一步都图文解释哦)

当你想要连接本机数据库时,是不是有可能突然忘记了自己的数据库密码? 在此文中,我们来详细解决一下如何去修改自己的数据库密码,并使用Navicat来连接测试 1.停止mysql服务 打开终端,键入命令,将mysql服务先停止掉,…

Matlab论文插图绘制模板第128期—函数三维折线图(fplot3)

在之前的文章中,分享了Matlab函数折线图的绘制模板: 进一步,再来分享一下函数三维折线图。 先来看一下成品效果: 特别提示:本期内容『数据代码』已上传资源群中,加群的朋友请自行下载。有需要的朋友可以关…

Linux系统编程:文件系统总结

目录和文件 获取文件属性 获取文件属性有如下的系统调用,下面逐个来分析。 stat:通过文件路径获取属性,面对符号链接文件时获取的是所指向的目标文件的属性 从上图中可以看到stat函数接收一个文件的路径字符串(你要获取哪个文件的属性&a…

数据结构和算法-树和二叉树的定义和基本术语和性质

文章目录 树的基本概念和相关术语相关的应用节点间的关系描述节点,树的属性描述有序树vs无序树树vs森林小结 树的相关性质考点1考点2考点3考点4考点5考点6小结 二叉树的相关概念和基本术语重要 (五种状态)特殊二叉树小结 二叉树的相关性质二叉…

SpringCloudAlibaba之Nacos的持久化和高可用——详细讲解

目录 一、Nacos持久化 1.持久化说明 2.安装mysql数据库5.6.5以上版本(略) 3.修改配置文件 二、nacos高可用 1.集群说明 2.nacos集群架构图 2.集群搭建注意事项 3.集群规划 4.搭建nacos集群 5.安装Nginx 6.配置nginx conf配置文件 7.启动nginx进行测试即可 一、Nacos持久…

【算法】NOIP2003神经网络

题目描述 人工神经网络(Artificial Neural Network)是一种新兴的具有自我学习能力的计算系统,在模式识别、函数逼近及贷款风险评估等诸多领域有广泛的应用。对神经网络的研究一直是当今的热门方向,兰兰同学在自学了一本神经网络的…

经验分享:JMeter控制RPS

一、前言 ​ RPS (Request Per Second)一般用来衡量服务端的吞吐量,相比于并发模式,更适合用来摸底服务端的性能。我们可以通过使用 JMeter 的常数吞吐量定时器来限制每个线程的RPS。对于RPS,我们可以把他理解为我们的TPS,我们就…

19.Oracle11g中的游标

oracle11g中的游标 一、案例引入二、什么是游标三、隐式游标1、隐式游标的属性2、创建语法3、示例 四、显示游标1、显示游标的属性2、创建语法3、示例 五、REF游标1、REF游标的属性2、创建语法3、示例 六、循环游标1、 循环游标的作用2、用for 与 loop 创建3、示例 一、案例引入…

基于可微分渲染器的相机位置优化【PyTorch3D】

在这个教程中,我们将使用可微渲染学习给定参考图像的相机的 [x, y, z] 位置。 我们将首先使用相机的起始位置初始化渲染器。 然后,我们将使用它来生成图像,使用参考图像计算损失,最后通过整个管道进行反向传播以更新相机的位置。…

【开源】基于Vue+SpringBoot的企业项目合同信息系统

项目编号: S 046 ,文末获取源码。 \color{red}{项目编号:S046,文末获取源码。} 项目编号:S046,文末获取源码。 目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 数据中心模块2.2 合同审批模块2.3 合…

Flask Echarts 实现历史图形查询

Flask前后端数据动态交互涉及用户界面与服务器之间的灵活数据传递。用户界面使用ECharts图形库实时渲染数据。它提供了丰富多彩、交互性强的图表和地图,能够在网页上直观、生动地展示数据。ECharts支持各种常见的图表类型,包括折线图、柱状图、饼图、散点…