【实战】MySQL百万数据优化

news2024/11/25 0:27:27

业务场景

一般在项目开发中会有很多的统计数据需要进行上报分析,一般在分析过后会在后台展示出来给运营和产品进行「分页查看」「最常见的一种就是根据日期进行筛选」。这种统计数据随着时间的推移数据量会慢慢的变大,达到百万、千万条数据只是时间问题。

瓶颈再现

创建了一张user表,给create_time字段「添加了索引」。并在该表中添加了100w条数据。

3d79c01bce17efbb99ee43c0ec29b6d3.png

我们这里使用「limit分页」的方式查询下「前5条」数据和「后5条」数据在查询时间上有什么区别。

查询「前10」条基本上不消耗什么时间c4cd72d2eef42b917dfda70ff48f96a6.png

我们从第「50w」+开始取数据的时候,查询耗时1秒。eefbc6b6c0498fc96611597c91bb1c61.png

SQL_NO_CACHE
这个关键词是为了不让SQL查询走缓存。

同样的SQL语句,不同的分页条件,两者的性能差距如此之大,那么随着数据量的增长,往后页的查询所耗时间按理会越来越大。

问题分析

回表

我们一般对于查询频率比较高的字段会建立索引。索引会提高我们的查询效率。我们上面的语句使用了「SELECT * FROM user」,但是我们并不是所有的字段都建立了索引。当从「索引文件」中查询到符合条件的数据后,还需要从「数据文件」中查询到没有建立索引的字段。那么这个过程称之为「回表」

覆盖索引

如果查询的字段正好创建了索引了,比如 「SELECT create_time FROM user」,我们查询的字段是我们创建的索引,那么这个时候就不需要再去数据文件里面查询,也就「不需要回表」。这种情况我们称之为「覆盖索引」

IO

「回表操作通常是IO操作」,因为需要根据索引查找到数据行后,再根据数据行的主键或唯一索引去聚簇索引中查找具体的数据行。聚簇索引一般是「存储在磁盘上」的数据文件,因此在执行回表操作时需要从磁盘读取数据,而磁盘IO是相对「较慢」的操作。

LIMTI 2000,10 ?

你有木有想过「LIMIT 2000,10」会不会扫描1-2000行,你之前有没有跟我一样,觉得数据是直接从2000行开始取的,前面的根本没扫描或者不回表。其实这样的写法,一个完整的流程是查询数据,如果不能覆盖索引,那么也是要回表查询数据的。

现在你知道为什么越到后面查询越慢了吧!

问题总结

我们现在知道了LIMIT 遇到后面查询的性能越差,「性能差的原因是因为要回表」,既然已经找到了问题那么我们只需要「减少回表的次数」就可以提升查询性能了。

解决方案

既然覆盖索引可以防止数据回表,那么我们可以先查出来主键id(主键索引),然后将查出来的数据作为「临时表」然后 「JOIN」 原表就可以了,这样只需要对查询出来的5条结果进行数据回表,大幅减少了IO操作。

优化前后性能对比

我们看下执行效果:

  • 「优化前」:1.4s037dae54a2f88d2b42659639c55a349f.png

  • 「优化后」:0.2s13fbf54bf8d00e6f2e8b5aac52ee6e90.png

查询耗时性能大幅提升。这样如果分页数据很大的话,也不会像普通的limit查询那样慢。

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

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

相关文章

即时通讯APP开发费用成本多少?

移动互联网的发展,为人们的通讯交流提供了非常多的便利,一些即时通讯APP的出现,将人与人的距离再一次缩短。通过即时通讯APP软件,人们可以随时随地了解身边发生的新鲜事物,以及和朋友探讨各类趣事,甚至可以…

Kubernetes高可用集群

Kubernetes高可用集群 0、服务器信息 服务器为腾讯云服务器(按需计费,按流量计费,并且将IP转换为弹性IP,使用结束可关机仅收取硬盘等固定资源费用) 服务器名称IP描述Kuernetes-149.235.103.143master1Kuernetes-249…

黑熊“光临”美国小学,校长惊慌失措,转身就跑

最近,一则有趣的视频在网络上传播。一个平凡的清晨,美国西维吉尼亚州尼古拉斯县的萨拉小学校长马什遭遇了一次前所未有的惊险经历。 这位校长本想打开垃圾桶,却突然发现一头黑熊钻出了垃圾桶,这让他吓得跑得飞快。与此同时&#…

K8S通过Ansible安装集群

K8S通过Ansible安装集群 K8S集群安装可参考https://gitee.com/open-hand/kubeadm-ha.git、https://github.com/easzlab/kubeasz.git 安装高可用集群 git clone https://gitee.com/open-hand/kubeadm-ha.git && cd kubeadm-ha升级内核,非必需,默认不升级&…

二叉树原理

二叉树原理TOC 二叉树是公认的难解型数据结构,这里试着系统化的讨论一些与二叉树有关的内容: 二叉树的数据标记方法:层次数据(int t[N];),左右树标记(bool lr:0standForL, 1standForR)&#xf…

算法之路--冒泡排序算法

写在前面 很早就想系统梳理所接触的所有算法,但是只是存在于一个想法阶段,懒惰使人遗忘不是么。作为一个软件开发人员,绕不开算法与数据结构,既然绕不开,何不逐一分析学习透彻,与君共勉之。 冒泡排序算法&a…

单片机c51中断 — 中断嵌套实例IE0的置位和撤销

项目文件 文件 关于项目的内容知识点可以见专栏单片机原理及应用 的第五章,中断 根据下原理图,编程验证二级外部中断嵌套效果。其中K0定为低优先级中断源,K1为高优先级中断源。此外,利用发光二极管D1验证外部中断请求标志IE0在脉…

Minio(minio-20221029062133.0.0.x86_64.rpm) Linux 环境安装

Minio Linux 环境安装 资源下载 镜像下载地址:http://dltest.minio.org.cn/server/minio/release/linux-amd64/archive/ 资源包下载地址(与献文匹配):https://download.csdn.net/download/scdncby/87769604 安装 上传rpm安装…

React+Antd+Vite+TypeScript 项目实战教程

本教程属于react入门教程,课程围绕如何搭建一个项目框架展开,会带你快速了解react、redux、redux-devtool、react-router-dom、axiox这些常见技术的使用方式,教程最后会附上项目源码。 一、创建项目 在搭建项目时,我们通常会使用…

day38_JDBC

今日内容 上课同步视频:CuteN饕餮的个人空间_哔哩哔哩_bilibili 同步笔记沐沐霸的博客_CSDN博客-Java2301 零、 复习昨日 一、数据库连接池 二、反射 三、封装DBUtil 零、 复习昨日 SQL注入 预处理语句 String sql "select * from user where id ?"; PreparedStat…

Spring Boot访问数据库

SpringBoot访问数据库时,我们可以使用以下三种,JdbcTemplate、Spring Boot Data Jpa、mybatis。 JdbcTemplate是Spring自己提供的,但是其操作不方便,甚至有些繁琐,在实际应用中也是很少会使用,所以这里就不…

使用MobaXterm在Windows系统远程Ubuntu系统

使用场景 通常大部分办公软件都安装在Windows系统上,使用Windows系统办公更便捷,并且大多办公软件在Ubuntu系统上不兼容,即使进行处理,使用体验也不好,下面针对在同一局域网使用Windows远程Ubnuntu进行ssh、VNC和打开…

Nature -- 空间表观组学与转录组学联合分析,揭示基因表达的精准调控

为充分理解组织中单细胞的基因表达调控,需要在单细胞水平以空间分辨率的方式集成不同分子信息的不同层面,包括表观基因组和转录组数据。虽然单细胞多组学方法可以捕捉来自不同分子层的信息,但是空间组学方法到目前为止主要局限于一层分子。张…

MATLAB的无人机遥感数据预处理与农林植被性状估算实践

在新一轮互联网信息技术大发展的现今,无人机、大数据、人工智能、物联网等新兴技术在各行各业都处于大爆发的前夜。为了将人工智能方法引入农业生产领域。首先在种植、养护等生产作业环节,逐步摆脱人力依赖;在施肥灌溉环节构建智慧节能系统&a…

ASP.NET core WebApi Cors跨域解决

前言 我用了最新版的Asp.net webapi ,在csdn上面搜跨域如何解决的时候,发现csdn上面对于.NET技术讨论不是很多。没办法,只能面向官方文档和GitHub编程了。 项目类型确认 NuGet包引入 前面两个已经放弃维护了,我们就不用了。用最…

使用Actor-Critic的DDPG强化学习算法控制双关节机械臂

在本文中,我们将介绍在 Reacher 环境中训练智能代理控制双关节机械臂,这是一种使用 Unity ML-Agents 工具包开发的基于 Unity 的模拟程序。 我们的目标是高精度的到达目标位置,所以这里我们可以使用专为连续状态和动作空间设计的最先进的Deep…

【uni-app】errMsg : navigateTo:fail can not navigateTo a tabbar page报错解决方案

文章目录 前言一、报错二、解决方案更改api 总结 前言 大家好,今天在进行uni-app项目开发时,在进行页面跳转的时候报了一个错误,一开始觉得只是个小报错就没有仔细看这个报错,直接就到页面检查看是不是跳转没写好,但是…

Spring IOC:详解【依赖注入数值问题 依赖注入方式】

编译软件:IntelliJ IDEA 2019.2.4 x64 操作系统:win10 x64 位 家庭版 Maven版本:apache-maven-3.6.3 Mybatis版本:3.5.6 spring版本:5.3.1 文章目录 Spring系列专栏文章目录一、Spring依赖注入数值问题1.1 字面量数值问…

计算机网络 | 广播与组播

欢迎关注博主 Mindtechnist 或加入【Linux C/C/Python社区】一起学习和分享Linux、C、C、Python、Matlab,机器人运动控制、多机器人协作,智能优化算法,滤波估计、多传感器信息融合,机器学习,人工智能等相关领域的知识和…

Jetpack之livedata原理分析

1.LiveData是什么? 只有在生命周期处于started和resumed时。livedata才会更新观察者 2.Livedata的各种使用方式 1.更新数据 class MainActivity : AppCompatActivity() {override fun onCreate(savedInstanceState: Bundle?) {super.onCreate(savedInstanceSta…