艺考网
全国站

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

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

本文主要讲如何使用explain,以及explain的各种参数概念,后面会讲优化。

一、Explain 用法

模拟Mysql优化器如何执行SQL查询语句,了解Mysql如何处理你的SQL语句。分析查询语句或表结构的性能瓶颈。

语法:解释+SQL语句;

例如:解释select * from user;会生成如下SQL分析结果。下面详细解释每个字段。

二、id

是一组数字,代表多个表之间的查询顺序,或者包含子句的查询语句中的顺序。 id总共分为三种情况,下面依次详细说明。

id相同,但是执行顺序是从上到下。如果是子查询,id号会增加。 id值越大,优先级越高,越早执行。相同id和不同id同时存在。

三、select_type

select_type 包含以下几种值

简单主子查询派生联合联合结果简单

简单select查询,查询不包含子查询或联合查询

基本的

如果SQL语句包含任何子查询,则子查询的最外层将被标记为主查询

子查询

如果select 或where 中包含子查询,则该子查询将被标记为subQquery。同样的三个和两个同时出现。

衍生的

from 中包含的子查询将被标记为派生查询,查询结果将放置在临时表中。

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

工会/工会结果

如果有两个select查询语句,并且它们通过union连接,那么第二个select将被标记为union,并且union的结果将被标记为union结果。它的id 为空

四、table

表示该行数据来自哪个表。

五、type

类型代表MySQL使用哪种索引类型。不同索引类型的查询效率也不同。类型一般有以下几种

systemconsteq_refrefrangeindexallsystem

表中只有一行记录。 System 是const 的一个特例。这种情况几乎不会发生,可以忽略不计。

常量

将主键索引或唯一索引放入where条件中进行查询。 MySQL可以将查询条件转换为常量,只匹配一行数据,通过一次索引就可以找到数据。

等式引用

在多表查询中,例如T1和T2,T1中的一行记录只能找到T2中唯一的一行。说白了,T1和T2之间关联查询的条件是主键索引或者唯一索引,从而保证T1中的每一行记录只对应T2中的一行记录

举一个不恰当的例子,EXPLAIN SELECT * from t1, t2 where t1.id=t2.id

参考

它不是主键索引,也不是唯一索引,而是普通索引,可能返回多个符合条件的行。

范围

体现在索引的区间范围检索上,一般出现在where条件中的between、and、in等范围搜索中。

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

指数

遍历所有索引树来查找满足条件的行。索引文件仍然比数据文件小得多,因此它仍然比没有索引的全表扫描快得多。

全部

不使用索引,只是遍历所有表数据来查找符合条件的数据。

六、possible_keys

如果本次查询涉及的字段上有索引,则会列出来,表示可能使用的索引,但并不是真正会使用的索引。

七、key

本次查询实际使用的索引

八、key_len

表示索引中使用的字节数。通过该属性,可以知道查询中使用的索引长度。注意:此长度是最大可能长度,而不是实际使用的长度。在不损失准确性的情况下,长度越长短查询效率越高

九、ref

显示关联字段。如果使用常量等价查询,则显示const,如果是连接查询,则显示关联字段。

tb_emp表是非唯一索引扫描,实际使用的索引列是idx_name。由于tb_emp.name='rose' 是常量,因此ref=const。 tb_dept 是唯一索引扫描。从sql语句可以看出,实际上使用的是PRIMARY主键索引。 ref=db01.tb_emp.deptid 表示与db01数据库中tb_emp表的deptid字段关联。

十、rows

根据表信息统计和索引使用情况,我们可以大致估算出需要读取的行数才能找到所需的记录。行越小越好。

十一、extra

不适合在其他列中显示,但在优化过程中非常重要的信息

使用fileSort(重点优化)

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

俗称‘文件排序’,在数据量大的时候几乎是“九死一生”。在order by或group by排序过程中,order by的字段不是索引字段,或者select查询字段存在且不是索引字段,或者select查询字段都是索引字段,但是顺序order by字段和select索引字段不一致,会导致fileSort

使用临时(关键优化)

临时表用于保存中间结果,常见于order by和group by。

USING 索引(强调)

意味着对应的select操作使用了覆盖索引(Coveing Index)来避免访问表的数据行,效率非常高!如果同时出现using where,则表明该索引用于进行索引键值的搜索;如果using where没有同时出现,则使用表面索引来读取数据,而不是执行搜索操作。

使用地点

表示使用where过滤

使用连接缓冲区

使用连接缓存

不可能在哪里

where 子句的计算结果始终为false,并且不能用于获取任何元组

选择优化掉的表

在没有GROUPBY子句的情况下,基于索引优化MIN/MAX操作或者为MyISAM存储引擎优化COUNT(*)操作,不必等到执行阶段才进行计算。优化在查询执行计划生成阶段完成。

清楚的

用户评论

短发

终于懂了为什么加索引这么重要!

    有14位网友表示赞同!

*巴黎铁塔

之前一直以为解释器就是调数据库用的,这篇文章让我彻底明白了它的作用。

    有19位网友表示赞同!

怀念·最初

太实用了!我最近正好遇到MySQL慢查询的问题,这个方法简直是我的救命稻草。

    有18位网友表示赞同!

我就是这样一个人

explain讲得真清楚,一个新手都能看懂,厉害了

    有7位网友表示赞同!

淡淡の清香

视频的讲解方式很清晰易懂,我已经开始用起来啦!我的数据访问速度明显提升了

    有12位网友表示赞同!

不忘初心

MySQL索引优化一直是我比较头疼的事情,这个帖子完美解决了我的问题!

    有16位网友表示赞同!

惦着脚尖摘太阳

点赞!这篇文章太棒了,我终于明白了索引的作用。

    有11位网友表示赞同!

伪心

真救了我一把,之前慢查询的问题搞得我要崩溃了

    有18位网友表示赞同!

发型不乱一切好办

以前没怎么用过explain,现在看了这篇文章之后,感觉可以优化数据库查询速度啦~

    有16位网友表示赞同!

落花忆梦

MySQL索引优化 really need to learn this!感谢分享这个很棒的文章

    有15位网友表示赞同!

花开丶若相惜

以前不知道索引效率这么重要,这下明白啦!学习了学习了!

    有15位网友表示赞同!

烟花巷陌

explain 的使用简直太牛 了! 可以看到代码执行的详细情况,真是太好了!

    有13位网友表示赞同!

怅惘

强烈推荐给所有跟MySQL打架的人!

    有19位网友表示赞同!

顶个蘑菇闯天下i

分享这篇文章真是太好了,我的数据库查询速度终于有了显著提高!

    有15位网友表示赞同!

蝶恋花╮

作者思路清晰讲解到位,索引优化问题终于不再成为难题。

    有11位网友表示赞同!

笑傲苍穹

?explain命令好有用啊!原来可以这样看查询效率了!

    有7位网友表示赞同!

旧爱剩女

之前一直以为MySQL优化很简单,看了这篇文章之后才发现很多细节啊!

    有9位网友表示赞同!

代价是折磨╳

索引优化太重要了,必须好好学习一下!

    有13位网友表示赞同!

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

大家都在看

这次真的救了我,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
对于一分钟情景口语和听力,请使用“Excuse me!”请原谅我!

对于一分钟情景口语和听力,请使用“Excuse me!”请原谅我!

打扰一下! 1.对不起!请原谅我! 2.对不起,我迟到了。对不起,我迟到了。 *请原谅某人……希望因某事而被原谅。 3.这不是借口!这不是借口! 4.别再找借口了!别再找借口了! *找借口寻找
2024-10-05
“对不起?”是什么意思?英文的意思是?别把它理解为“打扰我”!

“对不起?”是什么意思?英文的意思是?别把它理解为“打扰我”!

1. 相识 熟人['kwent()ns] 熟人, 偶然认识, 熟人 解析: 熟人鞠躬点头熟人点头熟人示例: 她是我在维也纳的家人的一个偶然认识的人。 她是我们在维也纳的家人的密友。 我与他有一
2024-10-05
20套单词解析只是尖子生的一张门票。建议收藏

20套单词解析只是尖子生的一张门票。建议收藏

好的形容词, 副词好, 但这是一个形容词,指的是身体状况 他又好了。 2. 艰难,艰难 努力工作, 几乎不 努力工作 我简直不敢相信。 3. 迟到,最近 迟到了,迟到了, 最近最近,最近 我最近没
2024-10-05