`
sunqi
  • 浏览: 230408 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

Mysql之执行计划 查看索引利用情况 explain

    博客分类:
  • db
阅读更多

查看表索引

show index from table

使用

explain select * from table where id=1;

下面我们就来看看这个EXPLAIN分析结果的含义:

table:这是表的名字。
type:连接操作的类型。下面是MySQL文档关于ref连接类型的说明:

“对于每一种与另一个表中记录的组合,MySQL将从当前的表读取所有带有匹配索引值的记录。如果连接操作只使用键的最左前缀,或者如果键不是UNIQUE或PRIMARY KEY类型(换句话说,如果连接操作不能根据键值选择出唯一行),则MySQL使用ref连接类型。如果连接操作所用的键只匹配少量的记录,则ref是一种好的连接类型。”

在本例中,由于索引不是UNIQUE类型,ref是我们能够得到的最好连接类型。

如果EXPLAIN显示连接类型是“ALL”,而且你并不想从表里面选择出大多数记录,那么MySQL的操作效率将非常低,因为它要扫描整个表。你可以加入更多的索引来解决这个问题。预知更多信息,请参见MySQL的手册说明。
possible_keys:
可能可以利用的索引的名字。这里的索引名字是创建索引时指定的索引昵称;如果索引没有昵称,则默认显示的是索引中第一个列的名字。默认索引名字的含义往往不是很明显。
Key:
它显示了MySQL实际使用的索引的名字。如果它为空(或NULL),则MySQL不使用索引。
key_len:
索引中被使用部分的长度,以字节计。
ref:
它显示的是列的名字(或单词“const”),MySQL将根据这些列来选择行。在本例中,MySQL根据三个常量选择行。
rows:
MySQL所认为的它在找到正确的结果之前必须扫描的记录数。显然,这里最理想的数字就是1。
Extra:
这里可能出现许多不同的选项,其中大多数将对查询产生负面影响。在本例中,MySQL只是提醒我们它将用WHERE子句限制搜索结果集

 

 

 

◆ ID:Query Optimizer 所选定的执行计划中查询的序列号;
◆ Select_type:所使用的查询类型,主要有以下这几种查询类型
◇ DEPENDENT SUBQUERY:子查询中内层的第一个SELECT,依赖于外部查询的结果集;
◇ DEPENDENT UNION:子查询中的UNION,且为UNION 中从第二个SELECT 开始的后面所有
SELECT,同样依赖于外部查询的结果集;
◇ PRIMARY:子查询中的最外层查询,注意并不是主键查询;
◇ SIMPLE:除子查询或者UNION 之外的其他查询;
◇ SUBQUERY:子查询内层查询的第一个SELECT,结果不依赖于外部查询结果集;
◇ UNCACHEABLE SUBQUERY:结果集无法缓存的子查询;
◇ UNION:UNION 语句中第二个SELECT 开始的后面所有SELECT,第一个SELECT 为PRIMARY
◇ UNION RESULT:UNION 中的合并结果;
◆ Table:显示这一步所访问的数据库中的表的名称;
◆ Type:告诉我们对表所使用的访问方式,主要包含如下集中类型;
◇ all:全表扫描
◇ const:读常量,且最多只会有一条记录匹配,由于是常量,所以实际上只需要读一次;
◇ eq_ref:最多只会有一条匹配结果,一般是通过主键或者唯一键索引来访问;
◇ fulltext:
◇ index:全索引扫描;
◇ index_merge:查询中同时使用两个(或更多)索引,然后对索引结果进行merge 之后再读
取表数据;
◇ index_subquery:子查询中的返回结果字段组合是一个索引(或索引组合),但不是一个
主键或者唯一索引;
◇ rang:索引范围扫描;
◇ ref:Join 语句中被驱动表索引引用查询;
◇ ref_or_null:与ref 的唯一区别就是在使用索引引用查询之外再增加一个空值的查询;
◇ system:系统表,表中只有一行数据;
◇ unique_subquery:子查询中的返回结果字段组合是主键或者唯一约束;

◆ Possible_keys:该查询可以利用的索引. 如果没有任何索引可以使用,就会显示成null,这一
项内容对于优化时候索引的调整非常重要;
◆ Key:MySQL Query Optimizer 从possible_keys 中所选择使用的索引;
◆ Key_len:被选中使用索引的索引键长度;
◆ Ref:列出是通过常量(const),还是某个表的某个字段(如果是join)来过滤(通过key)
的;
◆ Rows:MySQL Query Optimizer 通过系统收集到的统计信息估算出来的结果集记录条数;
◆ Extra:查询中每一步实现的额外细节信息,主要可能会是以下内容:
◇ Distinct:查找distinct 值,所以当mysql 找到了第一条匹配的结果后,将停止该值的查
询而转为后面其他值的查询;
◇ Full scan on NULL key:子查询中的一种优化方式,主要在遇到无法通过索引访问null
值的使用使用;
◇ Impossible WHERE noticed after reading const tables:MySQL Query Optimizer 通过
收集到的统计信息判断出不可能存在结果;
◇ No tables:Query 语句中使用FROM DUAL 或者不包含任何FROM 子句;
◇ Not exists:在某些左连接中MySQL Query Optimizer 所通过改变原有Query 的组成而
使用的优化方法,可以部分减少数据访问次数;
◇ Range checked for each record (index map: N):通过MySQL 官方手册的描述,当
MySQL Query Optimizer 没有发现好的可以使用的索引的时候,如果发现如果来自前面的
表的列值已知,可能部分索引可以使用。对前面的表的每个行组合,MySQL 检查是否可以使
用range 或index_merge 访问方法来索取行。
◇ Select tables optimized away:当我们使用某些聚合函数来访问存在索引的某个字段的
时候,MySQL Query Optimizer 会通过索引而直接一次定位到所需的数据行完成整个查
询。当然,前提是在Query 中不能有GROUP BY 操作。如使用MIN()或者MAX()的时
候;
◇ Using filesort:当我们的Query 中包含ORDER BY 操作,而且无法利用索引完成排序操
作的时候,MySQL Query Optimizer 不得不选择相应的排序算法来实现。
◇ Using index:所需要的数据只需要在Index 即可全部获得而不需要再到表中取数据;
◇ Using index for group-by:数据访问和Using index 一样,所需数据只需要读取索引即
可,而当Query 中使用了GROUP BY 或者DISTINCT 子句的时候,如果分组字段也在索引
中,Extra 中的信息就会是Using index for group-by;
◇ Using temporary:当MySQL 在某些操作中必须使用临时表的时候,在Extra 信息中就会
出现Using temporary 。主要常见于GROUP BY 和ORDER BY 等操作中。
◇ Using where:如果我们不是读取表的所有数据,或者不是仅仅通过索引就可以获取所有需
要的数据,则会出现Using where 信息;
◇ Using where with pushed condition:这是一个仅仅在NDBCluster 存储引擎中才会出现
的信息,而且还需要通过打开Condition Pushdown 优化功能才可能会被使用。控制参数
为engine_condition_pushdown 。

分享到:
评论

相关推荐

    mysql 索引与执行计划

    ### MySQL 索引与执行计划 #### 一、索引与执行计划 ##### 1.1 索引入门 在深入探讨之前,我们首先需要理解什么是索引以及其重要性。 ###### 1.1.1 索引是什么 索引(Index)在MySQL中是一种帮助数据库高效获取...

    MYSQL执行计划及索引最佳实践

    ### MySQL执行计划及索引最佳实践 #### 一、MySQL执行计划详解 MySQL执行计划是MySQL处理SQL查询的方式,它提供了关于SQL语句如何被优化和执行的信息。通过理解执行计划,可以有效地优化SQL查询,提高数据库性能。...

    mysql文档执行计划

    MySQL提供了几种查看执行计划的方法,其中最基本的是使用`EXPLAIN`关键字。例如,`EXPLAIN SELECT ...`命令将显示查询的执行计划。此外,还有两种增强的调用方式: 1. **`EXPLAIN EXTENDED SELECT ...`**:这种变体...

    MySQL SQL执行计划分析与优化方案.pptx

    在 MySQL 中,可以使用 EXPLAIN 语句来查看 SQL 语句的执行计划。EXPLAIN 语句可以返回执行计划信息,包括执行类型、可能的索引、实际使用的索引、扫描的行数、过滤率等。 例如,以下是一个简单的 SQL 语句的执行...

    MySQL之高效覆盖索引

    ### MySQL之高效覆盖索引 #### 一、什么是覆盖索引? 覆盖索引(Covering Index)是数据库索引的一种优化技术,在MySQL等关系型数据库管理系统中被广泛应用。覆盖索引的特点在于它能够使得数据库系统在执行查询时...

    第四节 mysql 执行计划

    通过查看执行计划,我们可以了解MySQL如何处理我们的查询,包括数据的读取顺序、索引的使用情况、是否存在表扫描等,这对于定位性能瓶颈和优化查询速度至关重要。 MySQL提供了一个内置的EXPLAIN命令,用于获取查询...

    mysql 执行计划

    `mysql_explain.pptx`可能包含更详细的PPT演示,涵盖MySQL执行计划的各个方面,包括如何分析执行计划,如何根据执行计划调整索引,以及如何解决常见的性能问题。建议查看这份资料以获取深入的实践指导和案例分析。 ...

    Mysql 执行计划解读

    MySQL执行计划是数据库查询优化中不可或缺的一部分,它能够详细展示SQL查询的执行方式,帮助数据库管理员和开发人员深入理解查询的内部细节,从而对查询进行优化。执行计划通过EXPLAIN关键字来获取,它会对SELECT...

    MySql练习4:创建学生表和成绩表索引并查看索引.zip

    或者在查询计划中查看索引使用情况: ``` EXPLAIN SELECT * FROM students WHERE name = '张三'; ``` 5. **索引维护**: 虽然索引能提高查询性能,但也会占用额外的存储空间,并且在插入、更新和删除操作时...

    mysqlexplain.ppt

    MySQL的EXPLAIN命令是数据库管理员和开发者用来分析SQL查询执行计划的重要工具。它能帮助我们理解MySQL如何处理查询,从而优化查询性能。以下是对EXPLAIN命令及其相关知识点的详细解释。 1. **EXPLAIN调用方式**: ...

    MySQL创建索引,查看以及删除

    在实际应用中,可以使用MySQL的`EXPLAIN`命令来分析查询计划,理解索引的使用情况。例如: ```sql EXPLAIN SELECT * FROM my_table WHERE column1 = 'value'; ``` 通过观察结果,可以发现查询是否使用了索引,以及...

    Mysql Explain

    MySQL 查询优化器的主要目标之一是尽可能利用索引,并通过最严格的索引来减少数据行的数量。这样做是为了提高查询速度,即快速找到符合条件的数据行而非排除不符合条件的数据行。优化器会尝试尽快排除那些不满足条件...

    100 透彻研究通过explain命令得到的SQL执行计划(1).pdf

    在使用MySQL数据库时,explain命令是一个非常重要的工具,它可以帮助开发者理解MySQL优化器是如何执行一个给定的SQL查询语句的。通过分析执行计划,开发者可以更深入地了解查询性能,从而对SQL语句进行优化。本文将...

    mysql+explain实例分析

    `EXPLAIN`是MySQL提供的一种功能,用于在不实际执行查询的情况下分析SQL语句的执行计划。它帮助我们理解查询是如何工作的,包括哪些索引被使用,数据是如何获取的,以及查询的潜在性能问题。 首先,我们要知道的是...

    106 透彻研究通过explain命令得到的SQL执行计划(7).pdf

    在研究SQL语句的执行计划时,"explain命令"是一个非常重要的工具。通过explain命令可以得到SQL语句的执行计划,从而帮助我们了解SQL语句是如何被执行的。执行计划里面包含了多个字段,这些字段共同描述了查询的各个...

    查看mySQL数据库索引

    #### 二、查看MySQL索引的方法 在MySQL中,可以通过多种方式来查看数据库中的索引信息。其中一种常用的方法是利用`INFORMATION_SCHEMA.STATISTICS`表来获取相关信息。具体的SQL语句如下: ```sql SELECT * FROM ...

    mysql查询不走索引及解决方法

    mysql查询,通过explain 分析,没有利用到索引,查询效率不高等出现的问题。

    MySQL explain 笔记整理

    `EXPLAIN` 是 MySQL 提供的一个非常有用的工具,用于展示查询执行计划。通过它,我们可以了解到 SQL 查询是如何被执行的,这对于优化 SQL 语句、提高查询性能至关重要。 #### 二、EXPLAIN 输出字段详解 在使用 `...

Global site tag (gtag.js) - Google Analytics