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

欢迎关注公众号(通过文章导读关注:【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.hqwc.cn/news/466926.html

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

相关文章

###51单片机学习(1)-----单片机烧录软件的使用,以及如何建立一个工程项目

前言:感谢您的关注哦,我会持续更新编程相关知识,愿您在这里有所收获。如果有任何问题,欢迎沟通交流!期待与您在学习编程的道路上共同进步。 一. 两个主要软件的介绍 1.KeiluVision5软件 Keil uVision5是一款集成开发…

第9讲用户信息修改实现

用户信息修改实现 后端修改用户昵称: /*** 更新用户昵称* param wxUserInfo* param token* return*/ RequestMapping("/updateNickName") public R updateNickName(RequestBody WxUserInfo wxUserInfo,RequestHeader String token){if(StringUtil.isNot…

comfyui 使用教程

目录 入门通俗易懂教程 插件推荐: 动画插件 AnimateDiff: 局部重绘 人脸修复 进阶教程 comfyui换脸 AI换脸-reactor换脸插件控制AI绘画人物角色的一致性 sd对比 英文版,学英语不错: 入门通俗易懂教程 纯AI丝滑长视频教程…

STM32F1 引脚重映射功能

STM32 端口引脚重映射 文章目录 STM32 端口引脚重映射前言1、查阅芯片数据手册1.1 串口引脚重映射描述 2、代码部分2.1 核心代码部分 3、实验现象4、总结 前言 在写程序时遇到想要的端口功能,而这个引脚又被其它的功能占用了无法删除掉或直接使用,这种情…

《Python 网络爬虫简易速速上手小册》第8章:分布式爬虫设计(2024 最新版)

文章目录 8.1 分布式爬虫的架构8.1.1 重点基础知识讲解8.1.2 重点案例:使用 Scrapy 和 Scrapy-Redis 构建分布式爬虫8.1.3 拓展案例 1:使用 Kafka 作为消息队列8.1.4 拓展案例 2:利用 Docker 容器化工作节点 8.2 分布式任务管理8.2.1 重点基础…

【Chrono Engine学习总结】4-vehicle-4.2-车辆轨迹跟踪

由于Chrono的官方教程在一些细节方面解释的并不清楚,自己做了一些尝试,做学习总结。 0、Vehicle的driver driver在上一篇总结中有过介绍,【Chrono Engine学习总结】4-vehicle-4.1-vehicle的基本概念,这里进一步介绍。 对于一个…

Ubuntu Desktop - Files Preferences

Ubuntu Desktop - Files Preferences 1. Behavior2. ViewsReferences 1. Behavior Go to file browser’s Menu -> Edit -> Preferences -> Behavior 2. Views Go to file browser’s Menu -> Edit -> Preferences -> Views ​​​ References [1] Yong…

git安装部署及使用指令

git的安装 在Windows上安装Git从https://git-for-windows.github.io下载(网速慢的同学请移步国内镜像),然后按默认选项安装即可。 安装完成后,在开始菜单里找到“Git”->“Git Bash”,蹦出一个类似命令行窗口的东西,就说明Git安装成功! 安装完成后,还需要最后一步设…

【C++】类的隐式类型转换

文章目录 前言一、隐式类型转换二、explicit关键字总结 前言 一、隐式类型转换 C 类的隐式类型转换是指当一个类定义了适当的构造函数或转换函数时,可以在需要时自动进行类型转换,而无需显式调用转换函数或构造函数。这使得代码更具灵活性和简洁性。下面…

CTFSHOW web 89-100

这边建议去我的gitbook或者github看观感更好(图片更完整) github:https://github.com/kakaandhanhan/cybersecurity_knowledge_book-gitbook.22kaka.fun gitbook:http://22kaka.fun 🏈 CTFSHOW PHP特性 (1)WEB 89 ①代码解释 <?php/* # -*- coding: utf-8 -*- # @…

数据结构(4) 链表(链式存储)

链表&#xff08;链式存储&#xff09; 单链表定义基本操作的实现单链表的插入按位序插入指定节点的前插指定节点的后插 单链表的删除 小结 单链表 定义 顺序表优点:可随机存取&#xff0c;存储密度高&#xff0c;缺点:要求大片连续空间&#xff0c;改变容量不方便。 单链表优…

【蓝桥杯Python】试题 算法训练 比较

资源限制 内存限制&#xff1a;256.0MB C/C时间限制&#xff1a;1.0s Java时间限制&#xff1a;3.0s Python时间限制&#xff1a;5.0s 问题描述 给出一个n长的数列&#xff0c;再进行m次询问&#xff0c;每次询问询问两个区间[L1,R1]&#xff0c;[L2,R2]&#xff0c;   …