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

news2025/2/2 20:42:54

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

        这个问题很具体,所以还是可以去尝试优化一下,我们基于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()
BEGIN
  DECLARE i INT DEFAULT 0;
  DECLARE uid INT DEFAULT 0;
  WHILE i < 1000
  DO
    SET uid = 1;
    WHILE uid < 100001
    DO
      INSERT 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 THEN
        COMMIT;
      END IF;
    END WHILE;
    SET i = i + 1;
    COMMIT;
  END WHILE;
END $
DELIMITER ;

DELIMITER $
CREATE PROCEDURE insert_proc_2()
BEGIN
  DECLARE i INT DEFAULT 0;
  DECLARE uid INT DEFAULT 1;
  WHILE uid < 100001
  DO
    SET i = 0;
    WHILE i < 1000
    DO
      INSERT 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.coloradmin.cn/o/1427688.html

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

相关文章

解决nginx: [error] open() "/usr/local/nginx/logs/nginx.pid" failed错误

在往nginx.conf文件中添加tcp负载均衡的配置之后&#xff0c;使用./nginx -s reload启动&#xff0c;发现报错。 遂搜寻解决方法&#xff0c;最后通过nginx -c指定nginx.conf文件的路径&#xff0c;解决了问题。 /usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.…

2024 高级前端面试题之 HTTP模块 「精选篇」

该内容主要整理关于 HTTP模块 的相关面试题&#xff0c;其他内容面试题请移步至 「最新最全的前端面试题集锦」 查看。 HTTP模块精选篇 1. HTTP 报文的组成部分2. 常见状态码3. 从输入URL到呈现页面过程3.1 简洁3.2 详细 4. TCP、UDP相关5. HTTP2相关6. https相关7. WebSocket的…

数据库建模之PowerDesigner创建概念模型

数据模型&#xff08;Data Model&#xff09;是数据特征的抽象&#xff0c;它从抽象层次上描述了系统的静态特征、动态行为和约束条件&#xff0c;为数据库系统的信息表示与操作提供一个抽象的框架。数据模型所描述的内容有三部分&#xff0c;分别是数据结构、数据操作和数据约…

Qwen-VL 技术报告总结

感谢如此优秀的开源工作,仓库链接 Qwen-VL 权重分为 Qwen-VL && Qwen-VL-Chat,区别文档稍后介绍 训练过程 在第一阶段中主要使用224X224分辨率训练,训练数据主要来源是公开数据集,经过清洗,数据总量大约是1.4B,中文数据和英文j训练目标是视觉语言和文本语言对齐。…

【MySQL】——用SQL语句实现数据库和基本表的创建

&#x1f383;个人专栏&#xff1a; &#x1f42c; 算法设计与分析&#xff1a;算法设计与分析_IT闫的博客-CSDN博客 &#x1f433;Java基础&#xff1a;Java基础_IT闫的博客-CSDN博客 &#x1f40b;c语言&#xff1a;c语言_IT闫的博客-CSDN博客 &#x1f41f;MySQL&#xff1a…

Windows Server 2019 Web服务器搭建

系列文章目录 提示&#xff1a;这里可以添加系列文章的所有文章的目录&#xff0c;目录需要自己手动添加 例如&#xff1a;第一章 Python 机器学习入门之pandas的使用 提示&#xff1a;写完文章后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目…

【Java】实现图书管理系统

文章目录 1. 设计背景2. 需求分析3. 设计思路4. 实现4.1 book包4.1.1 Book类4.1.2 BookList类(书架) 4.2 user包4.2.1 User 类4.2.2 AdminUser类&#xff08;管理员用户&#xff09;4.2.3 NormalUser类&#xff08;普通用户&#xff09; 4.3 operation包4.3.1 IOPeration接口4.…

产学研交流 | 广东轻工职业技术学院莅临调研

产学研融合是当前教育发展的重要趋势&#xff0c;通过学校与企业之间的深度合作&#xff0c;提高学生的实践能力和创新精神&#xff0c;同时促进企业的技术进步和产业升级。 近日&#xff0c;广东轻工职业技术学院杨军主任、骨干教师丁向荣莅临科东软件&#xff0c;双方就“产学…

spring-security 默认登录页面

Spring Security是一个强大且高度可定制的身份验证和访问控制框架。天然与Spring整合&#xff0c;易扩展&#xff0c;引入jar包就可以用了&#xff0c;在boot自动装载下&#xff0c;不需要任何配置就可以控制资源访问。那么默认登录页是如何产生的呢&#xff1f; 版本信息 内…

使用 git 将本地文件上传到 gitee 远程仓库中,推送失败

项目场景&#xff1a; 背景&#xff1a; 使用 git 想要push 本地文件 到 另一个远程仓库&#xff0c;执行 git push origin master后此时报错 问题描述 问题&#xff1a; git push 本地文件 到 另一个远程仓库时&#xff0c;运行 git push origin master ,push文件失败&…

k8s之基础组件说明

前言 K8S&#xff0c;全称 Kubernetes&#xff0c;是一个用于管理容器的开源平台。它可以让用户更加方便地部署、扩展和管理容器化应用程序&#xff0c;并通过自动化的方式实现负载均衡、服务发现和自动弹性伸缩等功能。 具体来说&#xff0c;Kubernetes 可以将应用程序打包成…

异构计算关键技术之多线程技术(三)

异构计算关键技术之多线程技术&#xff08;三&#xff09; 一、多线程概述 1. 多线程的概念与优劣 多线程是指在程序中同时运行多个线程&#xff0c;每个线程都可以独立执行不同的代码段&#xff0c;且各个线程之间共享程序的数据空间和资源。 优劣&#xff1a; 优点&#…

Leetcode29-最大频率元素计数(3005)

1、题目 给你一个由 正整数 组成的数组 nums 。 返回数组 nums 中所有具有 最大 频率的元素的 总频率 。 元素的 频率 是指该元素在数组中出现的次数。 示例 1&#xff1a; 输入&#xff1a;nums [1,2,2,3,1,4] 输出&#xff1a;4 解释&#xff1a;元素 1 和 2 的频率为 …

模板讲解之进阶

在之前的C入门的博客中我们就学习到了模板初阶&#xff0c;今天我们来学习模板的进阶&#xff0c;以便于更好地将模板运用到代码中 非类型模板参数 模板参数分类类型形参与非类型形参。 类型形参即&#xff1a;出现在模板参数列表中&#xff0c;跟在class或者typename之类的…

使用Docker部署DashDot服务器仪表盘并结合cpolar实现公网监测服务器

最近&#xff0c;我发现了一个超级强大的人工智能学习网站。它以通俗易懂的方式呈现复杂的概念&#xff0c;而且内容风趣幽默。我觉得它对大家可能会有所帮助&#xff0c;所以我在此分享。点击这里跳转到网站。 文章目录 1. 本地环境检查1.1 安装docker1.2 下载Dashdot镜像 2.…

氟化硼二吡咯甲基四嗪,BDP-FL-methyltetrazine,能够提高检测的灵敏度和特异性

BDP FL methyltetrazine&#xff0c;氟化硼二吡咯甲基四嗪&#xff0c;BDP-FL-methyltetrazine&#xff0c;能够提高检测的灵敏度和特异性 您好&#xff0c;欢迎来到新研之家 文章关键词&#xff1a;BDP FL methyltetrazine&#xff0c;氟化硼二吡咯甲基四嗪&#xff0c;BDP-…

Golang 并发控制方式有哪些

Go语言中的goroutine是一种轻量级的线程&#xff0c;其优点在于占用资源少、切换成本低&#xff0c;能够高效地实现并发操作。但如何对这些并发的goroutine进行控制呢&#xff1f; 一提到并发控制&#xff0c;大家最先想到到的是锁。Go中同样提供了锁的相关机制&#xff0c;包…

Android.bp入门指南之浅析Android.bp文件

文章目录 Android.bp文件是什么&#xff1f;Android.bp的主要作用模块定义依赖关系构建规则模块属性插件支持模块的可配置性 为什么会引入Android.bp语法例子 Android.bp文件是什么&#xff1f; Android.bp 文件是 Android 构建系统&#xff08;Android Build System&#xff…

第1章 简单使用 Linux

第1章 简单使用 Linux 1.1 Linux 的组成 1.2 远程连接 首先以 root 用户登录到 Linux 系统&#xff0c;然后在 Terminal 终端上输入 ip add 命令&#xff0c;来查看 IP 地址。 上图中的 192.168.72.128 就是 IP 地址。 然后打开 XShell 远程连接工具。 然后在命令提示符下输…

2024年美赛数学建模A题思路分析 - 资源可用性和性别比例

# 1 赛题 问题A&#xff1a;资源可用性和性别比例 虽然一些动物物种存在于通常的雄性或雌性性别之外&#xff0c;但大多数物种实质上是雄性或雌性。虽然许多物种在出生时的性别比例为1&#xff1a;1&#xff0c;但其他物种的性别比例并不均匀。这被称为适应性性别比例的变化。…