MySQL 慢查询探究分析

目录

背景:

mysql 整体结构:

SQL查询语句执行过程是怎样的:

  知道了mysql的整体架构,那么一条查询语句是怎么被执行的呢:

什么是索引: 

建立索引越多越好吗:  

如何发现慢查询:

如何优化满查询:


背景:

  性能测试过程中,数据库往往是造成性能瓶颈之一,而数据库瓶颈中sql 语句又是值得探究分析的一环,其中慢查询是重点优化对象,在MySQL中,慢查询是指查询执行时间较长或者消耗

较多资源的查询语句。具体来说,MySQL中可以通过设置一个阈值来定义慢查询,通常默认情况下是超过2秒钟的查询会被认为是慢查询,但是这个阈值可以根据具体情况进行调整。

慢查询的存在可能会对MySQL数据库的性能产生负面影响,因为它会占用大量的计算资源和I/O资源,导致其他查询的响应时间变慢。因此,及时发现并优化慢查询非常重要。

mysql 整体结构:

MySQL是一个典型的客户端-服务器(Client-Server)架构系统,它主要由以下几个组件构成:

  1. 客户端(Client):客户端是指连接到MySQL服务器的程序或工具,它们可以通过网络或本地套接字与MySQL服务器通信。MySQL提供了多种客户端工具,如mysql命令行工具、MySQL Workbench、phpMyAdmin等。

  2. 连接管理器(Connection Manager):连接管理器负责管理客户端连接和会话。它接收客户端的连接请求,并根据配置文件中的参数来限制连接数、最大并发数等,确保MySQL服务器的稳定性和安全性。

  3. 查询解析器(Query Parser):查询解析器负责解析客户端提交的SQL查询语句,并将其转换成MySQL服务器可理解的内部数据结构。在此过程中,查询解析器会检查查询语句的语法和语义是否正确,以及权限是否足够执行该查询。

  4. 优化器(Optimizer):优化器是MySQL查询执行的关键组件,它负责优化查询执行计划,以获得最佳的执行效率。优化器会分析查询语句,选择最优的索引、表的访问顺序、连接方式等来执行查询。MySQL提供了多种优化器,如基于规则的优化器、基于成本的优化器等。

  5. 存储引擎(Storage Engine):存储引擎是MySQL数据库中存储和管理数据的核心组件。MySQL支持多种存储引擎,如InnoDB、MyISAM、MEMORY等。每个存储引擎都有其独特的特性和适用场景,如InnoDB适合于高并发、事务性操作,MyISAM适合于读密集型操作等。

  6. 缓存(Cache):缓存是MySQL性能优化的重要手段之一。MySQL提供了多种缓存机制,如查询缓存、表缓存、缓冲池等。查询缓存可以缓存查询结果,以减少重复查询的开销;表缓存可以缓存表结构,以加速表的访问;缓冲池可以缓存磁盘上的数据,以提高数据访问的速度。

总的来说,MySQL架构是由客户端、连接管理器、查询解析器、优化器、存储引擎和缓存等组件构成的。每个组件都有其独特的作用和功能,共同协作来实现MySQL数据库系统的高效稳定运行。

SQL查询语句执行过程是怎样的:

  知道了mysql的整体架构,那么一条查询语句是怎么被执行的呢:

  你会先连接到这个数据库上,这时候接待你的就是连接器,连接建立完成后,执行逻辑就会来到查询缓存。如果开启来了查询缓存,之前执行过的语句及其结果可能会以 key-value 对的形

式,被直接缓存在内存中。如果命中,value直接返回给客户端。没有命中,则继续。执行完成后,执行结果会被存入查询缓存中。如果没有命中查询缓存,进入分析器,通过词法分析+语法分

析对 SQL 语句做解析,语法错误是从这个环节报出的。优化器是为了提升SQL的执行性能。经过了分析器,MySQL 就知道要做什么了。在开始执行之前,还要先经过优化器的处理。在表里面

有多个索引的时候,决定使用哪个索引;或者在一个语句有多表关联(join)的时候,决定各个表的连接顺序。优化器优化后进入了执行器阶段,执行器跟存储层进行交互,取得执行结果并返

回。

什么是索引: 

  索引是一种用于加速数据库查询的数据结构。它可以快速定位到满足查询条件的记录,从而提高查询效率和性能。简单来讲,索引的出现其实就是为了提高数据查询的效率,就像书的目录

一样,如果你想快速找到其中的某一个知识点,在不借助目录的情况下,那我估计你可得找一会儿。同样,对于数据库的表而言,索引其实就是它的“目录”。在MySQL中,索引通常是基于B-

Tree(B树)或哈希表实现的。

  索引主要包括主键索引和和非主键索引,主键索引是建立在表的主键列上的索引,而非主键索引则是建立在其他列或列组合上的索引。在查询过程中,主键索引和非主键索引的查询方式和效率有所不同。对于主键索引,MySQL可以通过B-Tree索引结构快速定位到指定的行记录,因为主键索引唯一,每个值都对应一个行记录,因此可以直接找到匹配的行记录。例如,如果需要查询id为10的学生记录,可以使用如下的SQL语句:

    SELECT * FROM students WHERE id = 10;

  MySQL会利用主键索引快速定位到id为10的行记录,效率非常高。而对于非主键索引,MySQL也可以通过B-Tree索引结构定位到满足查询条件的行记录,但是需要额外的步骤。首先,MySQL会根据非主键索引找到满足查询条件的行记录的主键值,然后再通过主键索引定位到实际的行记录。例如,如果需要查询姓名为“Tom”的学生记录,可以使用如下的SQL语句:

    SELECT * FROM students WHERE name = 'Tom';

MySQL会利用非主键索引idx_students_name找到所有姓名为“Tom”的行记录的主键值,然后再根据主键索引定位到实际的行记录。这个过程称为“回表查询”,需要额外的IO操作和CPU计

算,因此效率相对较低。如果表中的数据量很大,回表查询的开销会更加显著。

建立索引越多越好吗:  

  建立索引并不是越多越好,反而可能会对数据库性能产生负面影响。首先,索引会占用存储空间,如果过多地建立索引,会导致数据库占用更多的磁盘空间,对于大型数据库来说,这可能

会导致磁盘空间不足。其次,索引会影响插入、更新和删除操作的性能。当进行插入、更新和删除操作时,MySQL需要更新数据和索引,如果过多地建立索引,就会使这些操作花费更多的时

间,从而降低数据库的性能。

  最后,索引会影响查询操作的效率。虽然索引可以加速查询操作,但是如果过多地建立索引,就会导致MySQL需要在多个索引中选择最优的索引,这会增加查询的开销,并且可能会导致

MySQL选择不合适的索引,从而降低查询的效率。因此,在建立索引时,需要根据具体情况进行选择,避免过多地建立索引。通常情况下,可以考虑在经常使用的列上建立索引,或者在需要优

化查询的列上建立索引。同时,可以通过监控索引的使用情况,来确定哪些索引需要优化或删除,以提高数据库的性能和效率。

如何发现慢查询:

  1.  通过设置slow_query_log参数来开启慢查询日志,对慢查询日志进行监控,如果新增慢查询便立即发送通知。(推荐)

  2. 慢查询日志分析工具:MySQL提供了一些工具,如mysqldumpslow和mysqlsla,可以根据查询日志来分析慢查询,找出执行时间最长的查询和最频繁的查询等信息。

如何优化满查询:

情况1 :通过explain你可能会发现,SQL压根没走任何索引,而且现在表中的数据量巨大无比。

解决:建合适索引

情况2 : 通过explain查看SQL执行计划中的key字段。如果发现优化器选择的Key和你预期的Key不一样。那显然是优化器选错了索引

解决: 最快的解决方案就是:force index ,强制指定索引,或通过增加索引、优化索引、重构查询语句等方式来提高查询效率

情况3 :查询语句复杂或者存在大量子查询

解决:查询语句复杂或者存在大量子查询会影响查询性能,可以考虑通过优化SQL语句来提高查询效率。例如,可以使用JOIN语句替换多个子查询,或者使用WHERE子句限制返回的行数。

分析优化实践:

假设有一个名为“orders”的表,包含以下列:

  • id: INT,主键列
  • customer_id: INT,顾客编号
  • status: ENUM('pending', 'completed', 'cancelled'),订单状态
  • order_date: DATETIME,订单日期
  • amount: DECIMAL(10,2),订单金额

现在需要查询所有订单金额大于1000元的未完成订单,查询语句如下:

 SELECT * FROM orders WHERE status = 'pending' AND amount > 1000;

首先,可以通过使用EXPLAIN语句来查看查询计划,以了解查询的执行情况:

EXPLAIN SELECT * FROM orders WHERE status = 'pending' AND amount > 1000;

执行后发现 type列的值是ALL,走的全表扫描;key字段是NULL,没有使用任何索。接下来,可以在status和amount列上建立索引,建立索引的语句如下:

CREATE INDEX idx_orders_status ON orders (status);
CREATE INDEX idx_orders_amount ON orders (amount);

然后再次执行查询语句,可以看到查询效率有了显著提升,查询速度大大加快。

优化前的查询计划如下所示:

+----+-------------+-------+------------+------+---------------+------+---------+------+------+----------+-------------+
| id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra |
+----+-------------+-------+------------+------+---------------+------+---------+------+------+----------+-------------+
| 1 | SIMPLE | orders| NULL | ALL | NULL | NULL | NULL | NULL | 10 | 10.00 | Using where |
+----+-------------+-------+------------+------+---------------+------+---------+------+------+----------+-------------+

优化后的查询计划如下所示:

+----+-------------+-------+------------+------+---------------------------+------------------+---------+-------+------+----------+-----------------------+
| id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra |
+----+-------------+-------+------------+------+---------------------------+------------------+---------+-------+------+----------+-----------------------+
| 1 | SIMPLE | orders| NULL | ref | idx_orders_status,idx_orders_amount | idx_orders_status | 2 | const | 5 | 50.00 | Using index condition |
+----+-------------+-------+------------+------+---------------------------+------------------+---------+-------+------+----------+-----------------------+

可以看到,优化后的查询计划使用了idx_orders_status索引,查询效率大大提高。

因此,通过在status和amount列上建立索引的方式,可以提高查询效率,降低数据库的负载和响应时间。但需要注意的是,索引的建立需要根据具体情况进行选择和应用,过多的索引会影响插

入、更新和删除操作的性能,因此需要谨慎考虑索引的建立数量和方式。


 以下是我收集到的比较好的学习教程资源,虽然不是什么很值钱的东西,如果你刚好需要,可以评论区,留言【777】直接拿走就好了

各位想获取资料的朋友请点赞 + 评论 + 收藏,三连!

三连之后我会在评论区挨个私信发给你们~

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

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

相关文章

C语言学习笔记 vscode使用外部console-11

前言 在默认情况下,我们运行C语言程序都是在vscode终端的,在小程序运行时这个是没有问题的,但是当程序变得复杂它就不好用了,这时我们可以将这个终端设置为外部console,这样方便处理更多、更复杂的程序。 步骤 1.点击…

SSM——环境搭建、产品操作、订单操作

SSM 环境搭建与产品操作 1. 环境准备 1.1 数据库与表结构 1.1.1 创建用户与授权 数据库我们使用 Oracle Oracle 为每个项目创建单独 user , oracle 数据表存放在表空间下,每个用户有独立表空间 创建用户及密码 语法 [ 创建用户 ] : crea…

后端进阶之路——深入理解Spring Security配置(二)

前言 「作者主页」:雪碧有白泡泡 「个人网站」:雪碧的个人网站 「推荐专栏」: ★java一站式服务 ★ ★前端炫酷代码分享 ★ ★ uniapp-从构建到提升★ ★ 从0到英雄,vue成神之路★ ★ 解决算法,一个专栏就够了★ ★ 架…

根证书和中间证书有什么区别?

通常即使是获取了SSL证书的人,也只知道他们需要SSL证书,而且他们必须在服务器上安装SSL证书,才能通过HTTPS为网站提供服务。当进一步提到中间证书、根证书时,大多数人都感到陌生。本文小编就将为您介绍根证书与中间证书的定义以及…

实力认证!TDengine 入选 Gartner 中国数据分析与人工智能技术成熟度曲线

近日,国际权威研究机构 Gartner 发布了《2023 年中国数据分析及人工智能技术成熟度曲线》(即《Hype Cycle for Data, Analytics and AI in China, 2023》)报告,TDengine 成功入选实时数据管理领域代表产品。 作为评估全球新技术成…

Java使用String来开发验证码

Java使用String来开发验证码 需求分析代码实现小结Time 需求分析 使用String来开发验证码。 实现随机产生验证码,验证码的每位可能是数字、大写字母、小写字母 根据需求分析,步骤如下: 1.首先,设计一个方法,该方法接收…

机器学习复习题

1 单选题 ID3算法、C4.5算法、CART算法都是( )研究方向的算法。 A . 决策树 B. 随机森林 C. 人工神经网络 D. 贝叶斯学习 参考答案:A ( )作为机器学习重要算法之一,是一种利用多个树分类器进行分类和预测…

《Python入门到精通》os模块详解,Python os标准库

「作者主页」:士别三日wyx 「作者简介」:CSDN top100、阿里云博客专家、华为云享专家、网络安全领域优质创作者 「推荐专栏」:小白零基础《Python入门到精通》 os模块详解 1、文件目录操作os.stat() 获取文件状态os.utime() 修改文件时间os.r…

textarea 标签如何创建多行文本输入框?

聚沙成塔每天进步一点点 ⭐ 专栏简介⭐ textarea 的写法⭐ 代码含义⭐ 写在最后 ⭐ 专栏简介 前端入门之旅:探索Web开发的奇妙世界 记得点击上方或者右侧链接订阅本专栏哦 几何带你启航前端之旅 欢迎来到前端入门之旅!这个专栏是为那些对Web开发感兴趣、…

5G RedCap

5G RedCap指的是3GPP所提出的5G标准。与之前发布的5G标准相比,功能更加精简。5G RedCap于2019年6月首次被纳入3GPP R17研究项目。 把一些不必要的功能去掉就可以带来模组价格的降低。背后的基本想法是:为物联网应用定义一种新的、不那么复杂的NR设备。 …

linux系统虚拟主机开启支持Swoole Loader扩展

特别说明:只是安装支持Swoole扩展,主机并没有安装服务端。目前支持版本php5.4-php7.2。 1、登陆主机控制面板,找到【远程文件下载】这个功能。 2、远程下载文件填写http://download.myhostadmin.net/vps/SwooleLoader_linux.zip 下载保存的路…

React 入门学习

React 入门 一、基本认识1.1、前言1.2、什么是1.3、编译<br>1.4、特点1.5、高效 二、React环境和基本使用2.1、环境搭建2.2、脚手架项目基本使用2.2.1、src2.2.2、public2.2.3、package.json 三、JSX的理解和使用四、模块与模块化, 组件与组件化的理解4.1、模块与组件4.2…

【Matplotlib】一文搞定Matplotlib绘图配置(大三学长的万字笔记)

文章目录 一、Matplotlib介绍1 - 介绍2 - 安装 二、基本配置1 - 中文配置2 - 查看字体库3 - 基本绘图4 - 线样式和颜色 三、画布配置1 - 基本配置2 - 多图绘制 | 同一画布&#xff08;重叠&#xff09;3 - 多图绘制 | 多个画布4 - 多图绘制 | 同一画布&#xff08;子图&#xf…

海外媒体发稿:软文写作方法方式?一篇好的软文理应合理规划?

不同种类的软文会有不同的方式&#xff0c;下面小编就来来给大家分析一下&#xff1a; 方法一、要选定文章的突破点&#xff1a; 所说突破点就是这篇文章文章软文理应以什么样的视角、什么样的见解、什么样的语言设计理念、如何文章文章的标题来写。不同种类的传播效果&#…

【Leetcode】对称二叉树||递归(击败100%)

step by step. 题目&#xff1a; 给你一棵二叉树的根节点 root &#xff0c;翻转这棵二叉树&#xff0c;并返回其根节点。 示例 1&#xff1a; 输入&#xff1a;root [4,2,7,1,3,6,9] 输出&#xff1a;[4,7,2,9,6,3,1]示例 2&#xff1a; 输入&#xff1a;root [2,1,3] 输出…

使用node.js 搭建一个简单的HelloWorld Web项目

文档结构 config.ini #将本文件放置于natapp同级目录 程序将读取 [default] 段 #在命令行参数模式如 natapp -authtokenxxx 等相同参数将会覆盖掉此配置 #命令行参数 -config 可以指定任意config.ini文件 [default] authtokencc83c08d73357802 #对应一条隧…

Android 性能调优之bitmap的优化

背景 Android开发中&#xff0c;加载图片过多、过大很容易引起OutOfMemoryError异常&#xff0c;即我们常见的内存溢出。因为Android对单个应用施加内存限制&#xff0c;默认分配的内存只有几M&#xff08;具体视不同系统而定&#xff09;。而载入的图片如果是JPG之类的压缩格…

Python爬虫在电商数据挖掘中的应用

作为一名长期扎根在爬虫行业的专业的技术员&#xff0c;我今天要和大家分享一些有关Python爬虫在电商数据挖掘中的应用与案例分析。在如今数字化的时代&#xff0c;电商数据蕴含着丰富的信息&#xff0c;通过使用爬虫技术&#xff0c;我们可以轻松获取电商网站上的产品信息、用…

【数学】协方差介绍、相关系数介绍,Python代码

协方差 协方差&#xff08;Covariance&#xff09;是统计学中用来衡量两个随机变量之间关系的一种度量。它反映了这两个变量的变化趋势是否一致&#xff0c;即当一个变量偏离其均值时&#xff0c;另一个变量是否也倾向于偏离其均值。协方差可以帮助我们了解变量之间的线性关系…

【JAVA】七大排序算法(图解)

稳定性&#xff1a; 待排序的序列中若存在值相同的元素&#xff0c;经过排序之后&#xff0c;相等元素的先后顺序不发生改变&#xff0c;称为排序的稳定性。 思维导图&#xff1a; &#xff08;排序名称后面蓝色字体为时间复杂度和稳定性&#xff09; 1.直接插入排序 核心思…