【MySQL进阶之路】亿级数据量表SQL调优实战

news2024/10/6 7:13:04

欢迎关注公众号(通过文章导读关注:【11来了】),及时收到 AI 前沿项目工具及新技术的推送!

在我后台回复 「资料」 可领取编程高频电子书
在我后台回复「面试」可领取硬核面试笔记

文章导读地址:点击查看文章导读!

感谢你的关注!

在这里插入图片描述

亿级数据量表SQL调优实战

先说一下案例背景: 在电商平台中,有一个商品表,数据量级别上亿,有一天晚上突然出现大量的慢查询告警,导致每一个数据库连接执行慢查询耗费几十秒的时间,以至于数据库的连接被打满,无法建立新的连接,导致用户无法查询数据库中相关数据,相关的慢查询语句为:

select * from products where category = 'xx' and sub_category = 'xx' order by id desc limit xx, 10;

简化后的 SQL 语句如上,就是对商品表进行简单的查询,并且进行排序、分页处理

问题分析:

平常在运行的时候,并没有发现出现慢查询,因此 SQL 出现慢查询先查找代码有无提交,或者表中数据有无变化,经过查看,发现运营人员在商品分类表中新添加了几个分类,猜测和这个操作有关系!

那么先查看 SQL 的执行计划,找到慢查询出现的原因,对 SQL 进行 explain 之后,发现执行计划中 possible_key = index_category 表示要使用 index_category 这个索引,但是在 key 这一列的值为 PRIMARY,说明并没有用到 category 这个索引,而是使用了聚簇索引,并且 Extra 列的值为 Using where,因此分析慢查询出现的原因为: 在聚簇索引上扫描数据,并且使用 where 条件对数据进行过滤导致 SQL 执行过慢

image-20240213091943040

那么尝试一下强制让 SQL 走我们自己定义的 index_category 这个索引,发现 SQL 耗时仅仅上百毫秒,慢查询的现象消失了,因此问题就被解决了

通过 force index 就可以让 MySQL 强制走我们自己定义的索引,改变 MySQL 的执行计划!

问题原因:

既然问题解决了,接下来还要分析一下问题出现的原因,为什么 MySQL 不使用我们自己定义的 index_category 索引,而是去扫描聚簇索引呢?

这就是 MySQL 内部的优化,它认为使用了 index_category 这个索引之后,只能查出来索引数据+主键值,而 SQL 语句中是 select *,因此在扫描二级索引之后,还要根据主键值去聚簇索引中回表查询其他列的数据

因此性能不如直接去聚簇索引中扫描,直接根据 id 倒序扫描,取出来 10 条数据就可以了,这样会更快一些

那么 MySQL 优化之后,去聚簇索引中扫描反而出现了慢查询呢?

这就和上边说的运维人员在商品分类表中新添加了几个分类有关系了,由于这几个分类在商品表中没有对应数据,因此导致每一个用户来商品表查询这几个分类的商品时,都发现找不到对应的商品,因此每一次查询都会将整个聚簇索引给全部扫描一遍,上亿的数据,因此导致出现了慢查询!

所以说,这些问题在生产环境中都是无法避免的,因此一定要掌握 MySQL 中的执行计划,才可以通过执行计划找出 SQL 语句为什么执行速度太慢的原因!

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

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

相关文章

go 语言爬虫库goquery介绍

文章目录 爬虫介绍goquery介绍利用NewDocumentFromReader方法获取主页信息Document介绍通过查询获取文章信息css选择器介绍goquery中的选择器获取主页中的文章链接 爬取总结 爬虫介绍 爬虫,又称网页抓取、网络蜘蛛或网络爬虫,是一种自动浏览互联网并从网…

【Tauri】(2):使用Tauri应用开发,使用开源的Chatgpt-web应用做前端,使用rust 的candle做后端,本地运行小模型桌面应用

视频演示地址 https://www.bilibili.com/video/BV17j421X7Zc/ 【Tauri】(2):使用Tauri应用开发,使用开源的Chatgpt-web应用做前端,使用rust 的candle做后端,本地运行小模型桌面应用 1,做一个免…

【Java程序设计】【C00268】基于Springboot的CSGO赛事管理系统(有论文)

基于Springboot的CSGO赛事管理系统(有论文) 项目简介项目获取开发环境项目技术运行截图 项目简介 这是一个基于Springboot的赛事管理系统 本系统分为系统功能模块、管理员功能模块、参赛战队功能模块以及合作方功能模块。 系统功能模块:在系…

JavaI/O流 File类(文件)

目录 File类实例 File类 Java的File类是java.io.File的一个类,它表示文件或目录的路径名。这个类在处理文件和目录时非常有用,它提供了很多静态方法来操作文件和目录。 以下是一些File类的常见方法: 构造方法:创建表示文件或目…

MySQL篇----第二十一篇

系列文章目录 文章目录 系列文章目录前言一、什么是乐观锁二、什么是悲观锁三、什么是时间戳四、什么是行级锁前言 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站,这篇文章男女通用,看懂了就去分享给你的码吧。 一、…

Docker 一小时从入门到实战 —— Docker commands | Create your own image | vs VM ... 基本概念扫盲

Docker crash course 文章目录 Docker crash course1. What and Why of Docker?2.1 What2.2 What problem does it solve?2.2.1 before containers2.1.2 with containers 2. Docker vs Virtual Machines2.1 Difference2.2 Benefits 3. Install docker locally4. Images vs Co…

[1-docker-01]centos环境安装docker

官方参考文档 可以在官方docker桌面版本指导文档里找到适合自己的电脑平台进行参考,或者你是老司机的话直接自己上车。 如果不需要桌面版,也可以在官方docker engine版本指导文档里找到适合自己的平台进行参考,同样,老司机可以自…

全面详细对比@Resource和@Autowired

版权声明 本文原创作者:谷哥的小弟作者博客地址:http://blog.csdn.net/lfdfhl Resource和Autowired概述 在Java的Spring框架中,Resource和Autowired都是用于实现依赖注入(Dependency Injection, DI)的重要注解。依赖…

《Linux 简易速速上手小册》第8章: 安全性与加固(2024 最新版)

文章目录 8.1 防火墙与安全策略8.1.1 重点基础知识8.1.2 重点案例:配置 iptables 以保护 Web 服务器8.1.3 拓展案例 1:使用 firewalld 配置动态防御区域8.1.4 拓展案例 2:配置 ufw 以简化管理 8.2 SSH 安全最佳实践8.2.1 重点基础知识8.2.2 重…

《动手学深度学习(PyTorch版)》笔记8.6

注:书中对代码的讲解并不详细,本文对很多细节做了详细注释。另外,书上的源代码是在Jupyter Notebook上运行的,较为分散,本文将代码集中起来,并加以完善,全部用vscode在python 3.9.18下测试通过&…

LayoutInflater源码解析及常见相关报错分析

在日常Android开发中,最经常使用的RecyclerView控件是大家都绕不开的,而编写其Adapter时更离不开LayoutInflater的调用。当然,如果你做这一行有些时日了,相信你对其使用一定是炉火纯青了。即使如此,我觉得LayoutInflat…

【C++】STL之string 超详解

目录 1.string概述 2.string使用 1.构造初始化 2.成员函数 1.迭代器 2.容量操作 1.size和length 返回字符串长度 2.resize 调整字符串大小 3.capacity 获得字符串容量 4.reserve 调整容量 5.clear 清除 6.empty 判空 3.string插入、追加 、拼接 1.运算…

LeetCode:67.二进制求和

67. 二进制求和 - 力扣(LeetCode) 又是一道求和题,% / 在求和的用途了解了些, 目录 题目: 思路分析: 博主代码: 官方代码: 每日表情包: 题目: 思路分析&#xf…

第五课[lmdeploy]作业 +第六课[OpenCompass评测]作业

第五课基础作业 如下图,采用api_server部署,并转发端口通过curl提交内容。 第六课基础作业 完了捏?

【Java程序设计】【C00252】基于Springboot的实习管理系统(有论文)

基于Springboot的实习管理系统(有论文) 项目简介项目获取开发环境项目技术运行截图 项目简介 这是一个基于Springboot的实习管理系统 本系统分为前台功能模块、管理员功能模块、教师功能模块、学生功能模块以及实习单位功能模块。 前台功能模块&#xf…

【每日一题】LeetCode——反转链表

📚博客主页:爱敲代码的小杨. ✨专栏:《Java SE语法》 | 《数据结构与算法》 | 《C生万物》 ❤️感谢大家点赞👍🏻收藏⭐评论✍🏻,您的三连就是我持续更新的动力❤️ 🙏小杨水平有…

网络协议与攻击模拟_17HTTPS 协议

HTTPShttpssl/tls 1、加密算法 2、PKI(公钥基础设施) 3、证书 4、部署HTTPS服务器 部署CA证书服务器 5、分析HTTPS流量 分析TLS的交互过程 一、HTTPS协议 在http的通道上增加了安全性,传输过程通过加密和身份认证来确保传输安全性 1、TLS …

C++ 广度优先搜索(bfs)(五十四)【第一篇】

今天我们来学习一下一个新的搜索,广度优先搜索。 1.广度优先搜索的前提 队列(queue) 是一种 操作受限制 的线性表,其限制: 只允许从表的前端(front)进行删除操作; 只允许在表的后端…

基于无线传感器网络的LC-DANSE波束形成算法matlab仿真

目录 1.程序功能描述 2.测试软件版本以及运行结果展示 3.核心程序 4.本算法原理 4.1LC-DANSE算法原理 4.2 LCMV算法原理 5.完整程序 1.程序功能描述 在无线传感器网络中,通过MATLAB对比LC-DANSE波束形成算法和LCMV波束形成算法。对比SNR,mse等指标…

【go语言】一个简单HTTP服务的例子

一、Go语言安装 Go语言(又称Golang)的安装过程相对简单,下面是在不同操作系统上安装Go语言的步骤: 在Windows上安装Go语言: 访问Go语言的官方网站(golang.org)或者使用国内镜像站点&#xff0…