艺考网
全国站

MySQLSQL性能分析与优化工具详解

xunaa
2024-10-05 07:18:11
编辑说
系统的性能取决于我们SQL的查询速度。 MySQLExplain命令是分析SQL性能和优化不可或缺的一部分。
解释就是我们所说的解释器。通过explain,我们可以知道以下信息:表的读取顺序

系统的性能取决于我们SQL的查询速度。 MySQLExplain命令是分析SQL性能和优化不可或缺的一部分。

解释就是我们所说的解释器。通过explain,我们可以知道以下信息:表的读取顺序、数据读取操作的类型、可能使用了哪些索引、实际使用了哪些索引、表之间的引用、每个表有多少行等信息表由优化器查询。

Explain基本语法

解释[扩展|分区]选择

在select之前添加explain关键字,MySQL将返回查询的执行计划,而不是执行这条SQL。

根据语法我们知道explain还有另外两个用途:

1.explain扩展:可以在原有explain的基础上提供一些额外的查询优化信息。这个信息可以通过mysql的show warnings命令获取,看看优化器优化了哪些内容。

2、explainpartitions:与explain相比,多了partitions字段。如果查询基于分区表,则会显示查询将访问的分区。

Explain列的含义

id:id列的编号是select的序号。多个选择有多个id。 id不一样啊id值越大,优先级越高,越早执行。

select_type:显示该行是简单选择还是复杂选择。如果查询有任何复杂的子查询,则最外层标记为PRIMARY (DERIVED, UNION, UNION RESUlT)

table:访问查询的表名或表别名|

type:表的访问类型(MySQL如何查询表中的行记录)效率:const eq_ref/ref/range/index/all

possible_keys:表示MySQL可以使用哪个索引来查找该表中的行

key:MySQL实际决定使用的键(索引)。如果没有选择索引,则key为NULL

key_len:实际使用的索引长度(单位:字节)。该字段显示为索引字段的最大可能长度,而不是实际使用的长度。

rows:查询期望扫描的行数(在表或索引树中)

Filtered:按查询条件过滤的行记录比例

额外: 附加信息:

使用filesort:表示mysql将对数据应用外部索引排序。而不是按表内的索引顺序读取。 MySQL中无法使用索引完成排序操作的情况称为“文件排序”。使用temporary:使用临时表来保存中间结果。 MySQL 在对查询结果进行排序时使用临时表。常用于排序order by和分组查询group by。使用index:意味着相应的select操作使用覆盖索引来避免访问表的数据行。如果使用where同时出现,则使用表名索引进行索引键值查找;如果using where没有同时出现,则使用表名索引来读取数据,而不是执行查询动作。 using where :表示使用join buffer:进行where过滤使用连接缓存是不可能的,where:where子句的值始终为false,不能用于获取任何tupleselect表优化掉:在没有group by子句的情况下,优化Min based on索引、max操作或者针对MyISAM存储引擎优化计数(*),不需要等待执行阶段来执行计算,优化在查询执行计划生成阶段完成。 unique:优化distinct操作,在找到第一个匹配的元组后停止寻找相同的值。

详细介绍列的含义

1.ID栏

id的值是一个数值,代表SQL执行中的执行顺序。规则如下:

如果id值相同,则执行顺序为:从上到下。如果id值不同,则执行顺序为:id值较大的先执行。如果id值相同,则可以认为是同一个组,同组中的执行顺序为:所有组中从上到下,id值较大的先执行。如果id值为null,则表示这是一个临时表。临时表并不总是出现在SQL中,因此它的id为NULL。 MySQL将select查询分为简单查询和复杂查询。复杂查询分为三类:简单子查询、派生表(from 语句中的子查询)和联合查询。

MySQLSQL性能分析与优化工具详解

2. select_type 列

该列表示对应行对应的查询类型,是简单查询还是复杂查询。如果是复杂查询,是简单子查询、from语句中的子查询,还是联合查询和复杂查询。

1. simple:简单select查询,查询不包含子查询或联合

2. Primary:复杂查询的最外层查询类型

3.子查询:select或where列表中包含的子查询

4.衍生:from子句中包含的子查询。 MySQL 会将结果存储在临时表中,也称为派生表

5. Union:union之后出现union查询语句的第二个及后续查询将被标记为union类型。

6. Union result:从union建立的临时表中取出结果的查询类型

3.表格列

通过查看该列的名称,您可以看出它引用了特定查询的表名称。

当from子句中有子查询时,表列是derivenN格式,这意味着当前查询依赖于id=N的查询,因此首先执行id=N的查询。当存在并集时,UNION RESULT的表列值为union1,2。1和2代表参与并集的select行ID。

4.类型栏

该列表示关联类型或访问类型,这就是MySQL 确定如何在表中查找行的方式。

最好到最差的是: system const eq_ref ref fulltext ref_or_null index_merge unique_subquery index_subquery range index ALL

1、const、system:Mysql查询对其进行优化,将其转换为常量。只需一次查询即可搜索到结果。当主键或唯一键的所有列与常量进行比较时使用,因此表最多有一个匹配行。阅读一次,速度更快。

2. eq_ref:唯一索引扫描,对于每个索引键,表中只有一条记录与其匹配。常见于主键或唯一索引扫描

3、ref:与eq_ref相比,它不使用唯一索引,而是使用普通索引或联合索引的部分前缀。索引需要与某个值进行比较,可能会找到多个符合条件的行。

4. ref_or_null:与ref类型类似,但该类型可以搜索Null行

5.index_merge:采用索引合并的优化方法

6.range:范围扫描通常发生在in()、between、=等操作中。使用索引检索给定范围的行

7索引:Full Index Scan,Index和All的区别在于索引类型只遍历索引树。这通常比ALL 更快,因为索引文件通常小于数据文件

8、all:扫描全表,index实际上是扫描全表来检索数据。区别在于索引类型扫描索引树进行数据扫描,而All类型则直接扫描磁盘,因此比索引类型慢。

5. possible_keys 列

MySQLSQL性能分析与优化工具详解

显示此查询中可能使用的一个或多个索引。如果查询涉及的字段有索引,则会列出该索引,但可能不会应用。

解释时可能会出现possible_keys有列,但key显示NULL的情况。这是因为表中数据不多,而且MySQL认为索引对于本次查询帮助不大,所以选择了全表查询。

如果该列为NULL,则没有关联的索引。这种情况下,可以通过检查where子句看能否创建合适的索引来提高查询性能,然后使用explain查看效果。但有一种情况是可以使用索引的。如果出现覆盖索引,即使该列为空,仍然可以使用索引查询。

6.关键栏

mysql实际上使用哪个索引来优化对表的访问?如果想强制指定索引或者忽略索引,可以在查询中使用***强制索引或忽略索引***。

7. key_len 列

指示索引中使用的字节数。您可以使用此列来计算查询中使用的索引的长度。在不损失准确性的情况下,长度越短越好。 key_len代表索引的最大长度,不是实际使用的。长度。

key_len计算规则如下:

+ 字符类型

char(n):n字节长度varchar(n):2字节存储字符串长度,如果是utf-8则长度为3n + 2+数字类型

tinyint:1 字节Smallint:2 字节int:4 字节bigint:8 字节+ 时间类型

date:3字节timestamp:4字节datetime:8字节+ 如果该字段允许为NULL,则需要额外添加1个字节来记录是否为NULL

8.参考栏

该列显示表用来在关键列记录的索引中查找值的列或常量。常见的有:const(常量)、func、NULL、字段名

9. 行列

此列指示此SQL 可能检索的数据行数,而不是返回的结果集中的行数。

10.额外栏目

这一栏显示了一些额外的信息,但它也非常重要,对于我们提高SQL的检索性能很有帮助。

常见类型如下:

unique: 一旦mysql找到与该行联合匹配的行,就不再搜索Using index:表示在相应的select操作中使用覆盖索引(Covering Index)来避免访问表的数据行。效率还是非常可观的。覆盖索引:简单理解就是这次选择的字段只能从索引中获取。无需浪费另一个IO读取行数据。换句话说,查询的列被索引列覆盖。

using where:使用where条件查询。 mysql服务器将在存储引擎检索到行后对其进行过滤。即先读取整行数据,然后根据where条件进行检查。如果匹配,则保留,如果不匹配,则丢弃。使用临时表:mysql需要创建临时表来处理查询结果。发生这种情况时,通常需要进行优化。首先要做的就是利用索引进行优化。这种类型在order by 和group by 查询中很常见。使用filesort:查询结果按外部索引排序,而不是按索引顺序从表中读取行。这种情况下,可以考虑创建索引进行优化。参考文档

[Mysql官方文档-解释](https://dev.mysql.com/doc/refman/8.0/en/explain-output.html)

用户评论

|赤;焰﹏゛

真的好用!自从开始用<code>Explain</code> 分析 SQL 语句,查询速度明显提升了。

    有16位网友表示赞同!

来自火星的我

学习了一天,終於明白是怎么回事了!`Explain` 看出来的执行计划真是关键啊...

    有17位网友表示赞同!

该用户已上天

`Explain` 优化确实利器,帮我发现了之前代码的潜在问题。

    有6位网友表示赞同!

昂贵的背影

新手入门MySQL,这个<code>Explain</code>实在太方便了,直观明了的分析结果,简直是救星!

    有20位网友表示赞同!

〆mè村姑

经常遇到性能瓶颈,感谢 `Explain` 能提供详细的操作步骤和执行时间!

    有14位网友表示赞同!

北染陌人

真是个好东西!自从用上之后,优化 MySQL 的效率提高了很多。

    有15位网友表示赞同!

不浪漫罪名

`Explain` 可以让我知道 SQL 语句是如何执行的,方便排查性能问题。

    有6位网友表示赞同!

顶个蘑菇闯天下i

以前总是不知道 SQL 到底怎么执行的,用了 `Explain` 后终于看明白了。

    有9位网友表示赞同!

月下独酌

<code>Explain</code> 太强大了!可以帮我快速找出 MySQL 效率低下的部分。

    有16位网友表示赞同!

剑已封鞘

学习一个新工具, `Explain` 让我对MySQL理解更深刻。

    有20位网友表示赞同!

玩味

优化sql语句真是太依赖这个了!<code>Explain` ,必不可少!

    有12位网友表示赞同!

挽手余生ら

`Explain`真是个好东西,可以清晰的展现数据库执行流程,方便查找问题点。

    有9位网友表示赞同!

箜明

对于性能瓶颈排查, <code>Explain</code> 提供非常关键的信息提示。

    有12位网友表示赞同!

我家的爱豆是怪比i

`Explain` 是 MySQL 开发者和管理员必备工具!

    有11位网友表示赞同!

何年何念

MySQL 的 `Explain` 功能真棒,可以帮助我全面了解数据库的执行过程。

    有12位网友表示赞同!

炙年

推荐给所有MySQL开发人员使用 <code>Explain</code> 进行性能优化!

    有20位网友表示赞同!

莫阑珊

`Explain` 分析结果一目了然,非常好理解,很方便快速解决问题!

    有5位网友表示赞同!

免责声明
本站所有收录的学校、专业及发布的图片、内容,均收集整理自互联网,仅用于信息展示,不作为择校或选择专业的建议,若有侵权请联系删除!

大家都在看

MySQLSQL性能分析与优化工具详解

MySQLSQL性能分析与优化工具详解

系统的性能取决于我们SQL的查询速度。 MySQLExplain命令是分析SQL性能和优化不可或缺的一部分。 解释就是我们所说的解释器。通过explain,我们可以知道以下信息:表的读取顺序
2024-10-05
MySQL : 讲解快速查询手册

MySQL : 讲解快速查询手册

二 . explain 使用 三. 业务实践 在日常实践中,我们应该如何使用explain提供的查询来确定如何配置索引? 以实际业务场景为例。 首先,场景中的数据分布非常均衡,这导致设置的索
2024-10-05
MySQL性能优化工具详解

MySQL性能优化工具详解

解释SELECT * from user_info WHERE id 300;准备 为了方便演示EXPLAIN的使用,首先我们需要创建两张表用于测试,并添加相应的数据: 创建表`user_info` ( `id` BIGINT(20) N
2024-10-05
这次真的救了我,MySQL索引优化,解释的很清楚。

这次真的救了我,MySQL索引优化,解释的很清楚。

本文主要讲如何使用explain,以及explain的各种参数概念,后面会讲优化。 一、Explain 用法 模拟Mysql优化器如何执行SQL查询语句,了解Mysql如何处理你的SQL语句。分析查询语句
2024-10-05
mysql 解释用法

mysql 解释用法

使用时只需在select语句前添加explain即可,如: 解释select * from statuses_status where id=11; 解释栏解释 table:显示这行数据与哪个表相关 type:这是重要的列,显示连接使
2024-10-05
面试官:如何使用explain来分析SQL执行性能?

面试官:如何使用explain来分析SQL执行性能?

介绍 在工作中,我们捕获性能问题最常用的方法就是打开慢查询,定位执行效率差的SQL。然后当我们找到一条SQL时,我们还没有完成。我们还需要知道SQL的执行计划。比如全表扫描或者
2024-10-05
“对不起”不是“对不起”,小心别人看你!

“对不起”不是“对不起”,小心别人看你!

“熟悉的单词有部分含义”是英语中的常见情况。似乎每一个字都认识,但连在一起却又不知道是什么意思。 这里的“Excuse me for a moment”并不意味着“Excuse me for
2024-10-05
英语报告厅| “对不起”就是“对不起”吗?

英语报告厅| “对不起”就是“对不起”吗?

英语报告厅 “对不起”只是“对不起”吗? 英语口语中经常使用“Excuse me”这个短语。在我们看来,这句话也应该意味着“对不起”。然而,事实并非如此! “Excuse me”常用于以
2024-10-05
“Excuse me”的意思是“对不起”,但是“Excuse you”呢?

“Excuse me”的意思是“对不起”,但是“Excuse you”呢?

众所周知,Excuse me的意思是“对不起”,常用于某些场合表达歉意或打扰对方。 那么,既然你学了这么多年《Excuse me》,你见过《Excuse you》吗?你知道它的含义和具体用途吗?今天
2024-10-05
英语口语中“excuse me”的4种常见情况。学习日常生活英语。文章最后有惊喜。

英语口语中“excuse me”的4种常见情况。学习日常生活英语。文章最后有惊喜。

引起别人的注意 当我们想要引起别人的注意并询问某事时,我们可以使用Excuse me,意思是“对不起打扰你了,请原谅。”此时Excuse me前重后轻,用降调来吸引别人的注意。例如: 1)
2024-10-05