MySQL亿级数据的查询优化-历史表该如何建

        前端时间在知乎上看到一个问题,今天有空整理并测试了一下:

        这个问题很具体,所以还是可以去尝试优化一下,我们基于InnoDB并使用自增主键来讲。

        比较简单的做法是将历史数据存放到另一个表中,与最近的数据分开。那是不是历史表随便建就行了?其实这里的区别很大:       

         先讲一下优化思路:如果数据量太大(远远超过内存),对于批量查询来说单纯的添加索引作用不大,需要将数据按照查询重新组织降低查询需要的IO次数。

        首先拿一组数据来分析一下,如果采用自增ID,数据按写入顺序存储在磁盘上,数据在磁盘上的分布情况大体如下:

        如果把用户1的所有数据都查询出来,并且这些数据页都不在内存的情况下,需要执行3次IO。

        但是,只要将数据整理一下,同一个用户的数据顺序存放,即数据的组织方式如下:

查询用户1的所有数据,并且这些数据页都不在内存的情况下,只需要执行1次IO即可。

在这个场景中,通常一次读取几百条到上千条积分变化数据,性能差异还是非常明显的。

现在的问题是:怎么让数据的组织是顺序的?其实很简单,只需要在转储时将一个用户的所有数据一起转储(也就是相邻写入,这样他们存储在磁盘上也是相邻的)。

附:这里我们设计一个场景分别测试一下这两种情况的性能差别。

使用下面的语句创建两个表:

CREATE TABLE t_score_log_1
(`id` bigint AUTO_INCREMENT,`user_id` int,`score` int,`log_time` datetime,PRIMARY KEY(`id`),KEY `idx_user_id`(`user_id`)
);CREATE TABLE t_score_log_2
(`id` bigint AUTO_INCREMENT,`user_id` int,`score` int,`log_time` datetime,PRIMARY KEY(`id`),KEY `idx_user_id`(`user_id`)
) ;

然后,创建两个存储过程用于向两个表中插入数据:

DELIMITER $
CREATE PROCEDURE insert_proc_1()
BEGINDECLARE i INT DEFAULT 0;DECLARE uid INT DEFAULT 0;WHILE i < 1000DOSET uid = 1;WHILE uid < 100001DOINSERT INTO t_score_log_1(`user_id`,`score`,`log_time`) VALUES(uid,  i % 100, DATE_ADD('2023-1-1',interval i second));SET uid = uid + 1;IF uid % 1000 = 0 THENCOMMIT;END IF;END WHILE;SET i = i + 1;COMMIT;END WHILE;
END $
DELIMITER ;DELIMITER $
CREATE PROCEDURE insert_proc_2()
BEGINDECLARE i INT DEFAULT 0;DECLARE uid INT DEFAULT 1;WHILE uid < 100001DOSET i = 0;WHILE i < 1000DOINSERT INTO t_score_log_2(`user_id`,`score`,`log_time`) VALUES(uid,  i % 100, DATE_ADD('2023-1-1',interval i second));SET i = i + 1;END WHILE;SET uid = uid + 1;COMMIT;END WHILE;
END $
DELIMITER ;

接着,调用这两个函数向两个表中写入数据:

call insert_proc_1();call insert_proc_2();

注意:为了更快的插入数据,关闭mysql的binlog并设置innodb_flush_log_at_trx_commit为0。

***************等待中****************

终于,数据插入完成,随机查询一些用户的历史数据比较一下耗时:

可以看到针对整理过后的数据(也就是表:t_score_log_2)查询性能远远高于未整理的表。

所以,针对历史数据特别大的场景,适当调整数据的分布情况可以极大的提升查询性能。

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

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

相关文章

如何使用Linux Archcraft结合内网穿透实现SSH远程连接

&#x1f4d1;前言 本文主要是使用Linux Archcraft结合内网穿透实现SSH远程连接的文章&#xff0c;如果有什么需要改进的地方还请大佬指出⛺️ &#x1f3ac;作者简介&#xff1a;大家好&#xff0c;我是青衿&#x1f947; ☁️博客首页&#xff1a;CSDN主页放风讲故事 &#…

go gin 响应数据

go gin 响应数据 package mainimport ("fmt""github.com/gin-gonic/gin" )type UserInfo struct {UserName string json:"user_name"Age int json:"age"Password string json:"-" }func JsonTest(ctx *gin.Context…

黑马Java——常见API

一、游戏打包exe 游戏打包exe要考虑的因素&#xff1a; 游戏打包exe核心步骤&#xff1a; 详见《打包exe文档》 二、Math &#xff08;一&#xff09; Math类的常用方法 1、代码实现 2、小结

JVM 笔记

JVM HotSpot Java二进制字节码的运行环境 好处&#xff1a; 一次编写&#xff0c;到处运行自动内存管理&#xff0c;具有垃圾回收功能数组下标越界检查多态&#xff08;虚方法表&#xff09; JVM组成 类加载子系统&#xff08;Java代码转换为字节码&#xff09;运行时数据…

openEuler 22.03 登录提示设置

在openEuler系统中&#xff0c;您可以通过编辑 /etc/motd 文件来设置登录提示信息。motd 是 “Message of the Day” 的缩写&#xff0c;它通常包含当天的提示信息&#xff0c;在用户成功登录到Linux系统后显示。 以下是详细步骤&#xff1a;1、打开终端。2、使用文本编辑器打开…

【JavaEE进阶】 图书管理系统开发日记——贰

文章目录 &#x1f332;前言&#x1f384;设计数据库&#x1f343;引⼊MyBatis和MySQL驱动依赖&#x1f333;Model创建&#x1f38d;约定前后端交互接口&#x1f340;服务器代码&#x1f6a9;控制层&#x1f6a9;业务层&#x1f6a9;数据层 &#x1f334;效果展示⭕总结 &#…

01- k8s基础网络知识 之 underlay与overlay网络

前言&#xff1a; 我们在学习k8s网络之前&#xff0c;必须要了解k8s网络相关的一些基础知识&#xff0c;比如什么是underlay网络、overlay网络等&#xff0c;只有把基础知识掌握之后&#xff0c;后续学习k8s网络的时候&#xff0c;一些知识点就不会再云里雾里了。 1 underlay与…

协作办公开源神器:ONLYOFFICE

目录 前言ONLYOFFICE为什么选择ONLYOFFICE强大的文档编辑功能多种协作方式多人在线协同支持跨端多平台连接器安全性极高本地部署 ONLYOFFICE 8.0版本震撼来袭可填写的 PDF 表单显示协作用户头像更新插件界面设计更快更强大 总结 前言 近几年来&#xff0c;随着互联网技术的不断…

如何解决 docker registry x509 证书不信任问题?

最近想尝试一下极狐GitLab&#xff08;可以理解为 GitLab 在中国的发行版&#xff09;内置的容器镜像仓库&#xff0c;这样就不用自己安装 Harbor 之类的了。于是找了个服务器安装了一个极狐GitLab 的私有化部署版本&#xff0c;安装过程可以参考过往的技术文章使用Omnibus 安装…

2024前端技术趋势分析

文章目录 前端技术趋势分析无代码/低代码开发优点主要应用场景目前代表性技术 WebAssembly优点应用场景代表性技术 跨平台技术优点应用场景代表性技术 人工智能在前端的应用优点应用场景 总结 前端技术趋势分析 前端技术是 Web 开发的重要组成部分&#xff0c;它负责呈现用户界…

nodejs制作一个简单线程池

ThreadPool 类 const { Worker,parentPort,isMainThread } require(worker_threads) //主线程 if(isMainThread){class ThreadPool {size 5;queue [];workerGroup [];free0;maxFree2;monitornull;constructor(size) {this.size size;}//初始化子线程init(){for (let i 0…

在Windows搭建gRPC C++开发环境

本文介绍在Windows下使用Visual Studio 2017编译gRPC 1.48.0并配置开发环境&#xff0c;以及开发、配置一个简单的c服务端以及.net客户端。 0、前置条件 1、下载gRPC源码 使用git命令行在预备存放grpc源码的目录下执行, 此处我们下载的是 grpc 1.48.0 git clone -b v1.48.0 …

Pycharm python用matplotlib 3D绘图显示空白解决办法

问题原因&#xff1a; matplotlib版本升级之后显示代码变了&#xff0c;修改为新的 # ax Axes3D(fig) # 原代码 ax fig.add_axes(Axes3D(fig)) # 新代码import numpy as np import matplotlib.pyplot as plt from matplotlib import cm from mpl_toolkits.mplot3d import Ax…

测试环境搭建整套大数据系统(一:基础配置,修改hostname,hosts,免密,时间同步)

一&#xff1a;使用服务器配置。 二&#xff1a;修改服务器名称hostname&#xff0c;hosts。 在 Linux 系统中&#xff0c;hostname 和 /etc/hosts 文件分别用于管理主机名和主机名解析。 在三台服务器上&#xff0c;分别执行以下命令。 vim /etc/hostnamexdso-hadoop-test-0…

android 11 自定义Android device owner 接口

在设置里面自定义广播 去处理下面的事情 ComponentName mComponentnew ComponentName(packageName,receiverName); DevicePolicyManager mDPM.setDeviceOwner(mComponent,"d_owner_"mUserId); int mUserId android.os.Process.myPid(); int uid android.os…

༺༽༾ཊ—Unity之-04-原型模式—ཏ༿༼༻

首先创建一个项目&#xff0c; 在这个初始界面我们需要做一些准备工作&#xff0c; 建基础通用文件夹&#xff0c; 创建一个Plane 重置后 缩放100倍 加一个颜色&#xff0c; 任务1&#xff1a;使用 建造者模式 创建三种 金刚猿猴 零部件 拼接组合 首先资源商店下载 金刚猿猴 模…

常见的词法分析和语法分析的开源库收集

文章目录 一、词法及语法分析器汇总1.Flex2.Bison3.ANTLR3.Ply4.JFlex 一、词法及语法分析器汇总 1.Flex Flex是一个用于生成词法分析器的工具。它可以根据用户定义的正则表达式规则&#xff0c;将输入的字符流分割成一个个的词法单元。Flex是GNU项目的一部分&#xff0c;可以…

Redis数据淘汰策略

Redis作为一种高性能的键值存储数据库&#xff0c;通常用于缓存和提高数据检索速度。然而&#xff0c;由于内存资源有限&#xff0c;当内存不足以容纳所有数据时&#xff0c;Redis就需要采取一些策略来删除部分数据&#xff0c;以确保新的数据能够被写入。这就引入了数据淘汰策…

刨析数据结构(二)

&#x1f308;个人主页&#xff1a;小田爱学编程 &#x1f525; 系列专栏&#xff1a;数据结构————"带你无脑刨析" &#x1f3c6;&#x1f3c6;关注博主&#xff0c;随时获取更多关于数据结构的优质内容&#xff01;&#x1f3c6;&#x1f3c6; &#x1f600;欢迎…

strlen函数详解

&#x1f388;个人主页&#xff1a;甜美的江 &#x1f389;欢迎 &#x1f44d;点赞✍评论⭐收藏 &#x1f917;收录专栏&#xff1a;c语言 &#x1f91d;希望本文对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出指正&#xff0c;让我们共同学习、交流进步&a…