【MySQL进阶之路】十亿量级评论表SQL调优实战

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

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

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

感谢你的关注!

在这里插入图片描述

十亿量级评论表SQL调优实战

先说一下案例背景:

在电商系统的评论表中,数据量非常大,达到了十亿量级,因此对评论的数据库进行分库分表处理,在分库分表之后,基本上单表的评论数据在百万级别左右

那么就存在着某些商品比较火爆,销量达到几百万,评论的数量也有几十万条,用户可能会查看该商品中的评论,不停的分页查询,以及跳转到某一页查看具体的好评、差评信息,SQL 语句如下:

select * from comments where product_id = xx and is_good_comment = 1 order by desc limit 10000, 20

上边 SQL 语句的意思就是从评论表中取出来 20 条数据,limit 中的 offset 为 10000 条,分页中每页 20 条数据,10000 条数据也就是 500 页,表明用户要查询第 501 页的好评数据

**索引建立情况:**评论表中的核心索引为 index_product_id ,那么你可能会有疑问,为什么不对 (product_id, is_good_comment) 两个字段做联合索引呢?不要着急,在下边会说这个问题

慢查询原因分析:

那么上边的 SQL 语句出现了慢查询的情况,SQL 执行耗时达到 1-2 秒,接下来我们根据已知信息分析一下为什么 SQL 耗时这么久

where 条件中使用 product_id 进行条件过滤,而 product_id 作为索引存在,因此 MySQL 是会走这个二级索引的,但是由于是 select *,因此走二级索引查不到全部的数据,因此还需要进行回表查询

那么上边 SQL 执行的流程是先通过 product_id 索引对评论数据进行筛选,就按火爆商品来举例,筛选出来几十万条评论数据,那么接下来还要拿这几十万条评论数据回表查询,回表时通过 is_good_comment 字段筛选数据,筛选完数据之后可能还有十万条数据,此时再根据 id 字段进行倒序排序,这里又是基于临时磁盘文件进行排序,比较耗时,排序完毕之后,再根据偏移量取出当前分页的数据

因此,通过分析,这条 SQL 慢在了两个地方,第一是拿了几十万条数据进行回表查询;第二是对十万条数据进行磁盘排序

Billion magnitude review table SQL tuning in action

SQL 优化:

这里是有三个优化方案的:

  • 第一个方案是对 (product_id, is_good_comment) 建立联合索引,product_id 值是唯一的,但是 is_good_comment 字段的值就几个,如果建立联合索引会导致数据分布的不均匀,并且可能在用户评论之后,会有后台定时任务来对 is_good_comment 字段更新,更新时会导致索引节点移动,因此 is_good_comment 不适合用于建立联合索引,所以没有使用这种方案
  • 第二个方案是使用 force index 强制 MySQL 走聚簇索引,但是一般不建议使用 force index,因此没有使用这种方案
  • 第三个方案是改写 SQL 语句,本次优化使用的就是这种方案

改写后的 SQL 语句如下:

select * from comments a, (select id from comments where product_id = xx and is_good_comment = 1 order by id desc limit 10000, 20) b where a.id = b.id;

通过执行计划可以看到,上边的 SQL 语句会先执行括号内的子查询,执行子查询的时候 MySQL 就会认为直接走聚簇索引比较快一些,根据 id 倒序扫描数据,在扫描过程中根据 product_id 和 is_good_comment 两个字段进行数据的过滤,此时过滤出来了十万条数据,再通过 limit 取出来我们所需要的 20 条数据

接着就会拿这 20 条数据再去聚簇索引中找到完整的数据就可以了,优化之后 SQL 执行耗时为几百毫秒,流程如下:

image-20240213112056231

总结一下: 昨天我们说的 SQL 调优案例是强制让 MySQL 走二级索引来优化,但是这一次是我们通过修改 SQL 语句来让 MySQL 走聚簇索引来优化,因此在 MySQL 中对 SQL 的优化方式并不是固定的,也没有通用的方法,因此一定要掌握执行计划,了解 SQL 底层如何处理数据,才可以很快找到慢查询的原因!

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

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

相关文章

红日靶场(初学)

按照以前的来说一般是有两层网络的内网和外网 这个也是这样的 所以需要两张网卡,一个用来向外网提供web服务,一个是通向内网 以下就是配置 以下就是一些相关信息 外网网段是写成了192.168.111.1/24 WEB PC DC kali 开始扫描 nmap -sS -sV -Pn -T4 19…

「小明赠书活动」2024第三期《一书读懂物联网:基础知识+运行机制+工程实现》

⭐️ 赠书 - 《一书读懂物联网:基础知识运行机制工程实现》 《一书读懂物联网》以物联网工程技术为核心内容,结合数据处理的流程和技术,介绍了物联网的基础知识、运行机制及工程实现。 ⭐️ 内容简介 - 《一书读懂物联网:基础知识…

PLC_博图系列☞参数实例

PLC_博图系列☞参数实例 文章目录 PLC_博图系列☞参数实例背景介绍参数实例参数实例的工作原理创建参数实例将实例作为参数传送 关键字: PLC、 西门子、 博图、 Siemens 、 参数实例 背景介绍 这是一篇关于PLC编程的文章,特别是关于西门子的博图软件…

C++重新入门-字符串

C 提供了以下两种类型的字符串表示形式: C 风格字符串C 引入的 string 类类型 1.C 风格字符串 C 风格字符串是使用字符数组来表示的,以空字符 \0 结尾。它们通常被称为 "C-style strings"。例如: char str[] "Hello"…

掌握Go的加密技术:crypto/rsa库的高效使用指南

掌握Go的加密技术:crypto/rsa库的高效使用指南 引言crypto/rsa 库概览RSA 加密算法基本原理crypto/rsa 库的功能和应用 安装和基本设置在 Go 项目中引入 crypto/rsa 库基本环境设置和配置 密钥生成与管理生成 RSA 密钥对密钥存储和管理 加密和解密操作使用 RSA 加密…

JAVAWEB入门

JAVAWEB入门 本章内容: 一、 了解web开发的基本概念 浏览器/服务器: 客户端不需要安装应用程序,需要一个浏览器 客户端/服务器:客户端需要安装应用程序,服务器上一般放的是数据库 bs的优点:项目更新维护方…

leetcode:55.跳跃游戏

1.解题思路:贪心算法看最大覆盖范围 2.模拟过程: 1.若数组长度等于1,直接返回True 2.循环遍历覆盖范围,选取最大的覆盖范围;若覆盖范围覆盖到了最后一个元素,直接返回true. 3.代码:(贪心无套…

【C++关联式容器】unordered_set

目录 unordered_set 1. 关联式容器额外的类型别名 2. 哈希桶 3. 无序容器对关键字类型的要求 4. Member functions 4.1 constructor、destructor、operator 4.1.1 constructor 4.1.2 destructor 4.1.3 operator 4.2 Capacity ​4.2.1 empty 4.2.2 size 4.2.3 max…

C++:priority_queue模拟实现

C:priority_queue模拟实现 什么是priority_queue模拟实现向上调整算法向下调整算法插入与删除 仿函数 什么是priority_queue priority_queue称为优先级队列。优先级队列是一种特殊的队列,其中每个元素都有一个相关的优先级。元素的优先级决定了它们在队…

黑马Java——集合进阶(不可变集合、Stream流、方法引用)

目录 一、不可变集合 1、创建不可变集合的应用场景 2、创建不可变集合的书写格式 2.1、不可变的List集合 2.2、不可变的Set集合 2.3、不可变的Map集合 3、小结 二、Stream流 1、体验Stream流的作用 2、Stream流的思想 3、Stream流的使用步骤 3.1、单列集合获取Strea…

Kafka(三)(集成SpringBoot)

第三章 Kafka集成 SpringBoot SpringBoot 是一个在 JavaEE 开发中非常常用的组件。可以用于 Kafka 的生产者&#xff0c;也可以 用于 SpringBoot 的消费者。 在初始化springboot环境的时候要勾选kafka依赖 <dependency><groupId>org.springframework.kafka</gr…

【JavaEE】_Fiddler抓包HTTP请求与响应

目录 1. Fiddler简介 2. Fiddler安装步骤 3. 抓包结果举例&#xff08;sogou.com&#xff09; 1. Fiddler简介 1. 要查看HTTP的请求和响应&#xff0c;需要使用抓包工具进行抓包&#xff1b; 抓包即获取网卡上经过的数据并显示出来&#xff0c;常用的抓包工具有wireshark和…