`
san_yun
  • 浏览: 2653670 次
  • 来自: 杭州
文章分类
社区版块
存档分类
最新评论

查看mysql执行计划

 
阅读更多

 select * from message_message where id in(select message_id from message_message_tags where messagetag_id=59885) and (category=9 or category=1)order by  sum(like_count,favorite_count) desc limit 15;

 

     这条SQL执行4分钟,message_message有数据1000w,学写了下mysql的执行计划。

 

     在开发的过程中随着数据量的增大而感受到数据库的性能比较差从而延伸到响应速度慢,如果是开发人员很多时候估计是处于一种茫然状态,或者直接交给DBA去处理这问题,如果有DBA您很幸运,但是如果没有DBA的前提下我们怎么去处理这问题,可能唯一的方法就是看执行计划(也可以直接用explain SQL来分析...):
默认情况下Mysql的profiling是关闭的,所以首先必须打开profiling

 

 

 

set profiling="ON"
mysql> show variables like "%profi%";
+------------------------+-------+
| Variable_name          | Value |
+------------------------+-------+
| profiling              | ON    |

show processlist;   查看现在在运行的所有进程列表,在进程列表中我们唯一需要的是ID
mysql> show processlist;
+----+------+----------------+-----------+---------+------+-------+-------------
-----+
| Id | User | Host           | db        | Command | Time | State | Info
     |
+----+------+----------------+-----------+---------+------+-------+-------------
-----+
|  3 | root | localhost:2196 | click_log | Query   |    0 | NULL  | show process
list |
+----+------+----------------+-----------+---------+------+-------+-------------
mysql> show profile cpu,memory for query 3;
+--------------------+------------+----------+------------+
| Status             | Duration   | CPU_user | CPU_system |
+--------------------+------------+----------+------------+
| freeing items      | 0.00001375 |     NULL |       NULL |
| logging slow query | 0.00001375 |     NULL |       NULL |
| cleaning up        | 0.00000050 |     NULL |       NULL |
+--------------------+------------+----------+------------+

SHOW PROFILES Syntax:
SHOW PROFILE [type [, type] ... ]
    [FOR QUERY n]
    [LIMIT row_count [OFFSET offset]]
type:
    ALL
  | BLOCK IO
  | CONTEXT SWITCHES
  | CPU
  | IPC
  | MEMORY
  | PAGE FAULTS
  | SOURCE
  | SWAPS

 

 

查看表索引

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执行计划简介

    MySQL执行计划解读

    ■ MySQL执行计划调用方式 ■ 执行计划包含的信息 ■ 执行计划显示内容解读 ■ Q&A 通过执行计划可以了解什么

    mysql 索引与执行计划

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

    mysql执行计划PPT

    mysql执行计划详解,PPT格式

    mysql 执行计划

    MySQL执行计划是数据库管理员和开发人员用来优化查询性能的关键工具。它揭示了MySQL如何解析SQL语句、如何处理数据以及如何使用索引。通过理解执行计划,我们可以更好地了解查询的内部工作原理,从而进行必要的调整...

    第四节 mysql 执行计划

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

    MySQL 执行计划说明.md

    《MySQL 执行计划EXPLAIN说明.MD》该文档描述了有关MySQL 执行计划EXPLAIN各项参数说明,还文档基于Typora工具编写。内容是平时积累整理,仅供参考。文档中内容在博客...

    mysql文档执行计划

    ### MySQL执行计划详解 在数据库查询优化领域,理解MySQL执行计划是至关重要的技能之一。执行计划,也称为查询计划或查询执行计划,是MySQL优化器为执行SQL查询所选择的一系列步骤。它揭示了数据库如何处理查询,...

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

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

    MySQL执行计划选择-成本模型v1.11

    MySQL执行计划选择-成本模型v1.11 MySQL执行计划选择-成本模型v1.11是关系型数据库中执行计划选择的重要组成部分。执行计划选择是指数据库管理系统在执行查询语句时,选择合适的执行路径来提高查询效率的过程。...

    Mysql 执行计划解读

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

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

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

    95 MySQL是如何根据成本优化选择执行计划的?(中).pdf

    MySQL数据库系统中,查询优化器是负责生成和选择执行计划的关键组件,其工作原理是基于成本的优化。执行计划决定了如何以最快的速度从数据库中获取数据,是整个数据库性能优化中至关重要的一环。在MySQL中,执行计划...

    MySQL explain-MySQL执行计划解读.ppt

    MySQL explain-MySQL执行计划解读.ppt

    mysql 执行计划详解

    MySQL执行计划是数据库管理员和开发人员优化SQL查询性能的关键工具。它揭示了MySQL如何解析查询,确定数据检索的顺序,以及使用哪些索引。在本文中,我们将深入探讨MySQL执行计划,了解其重要性,如何生成,以及如何...

    MySQL执行计划详解及其应用技巧

    本文档详细解析了MySQL执行计划的各种特性以及具体操作参数的含义,涵盖不同类型的SQL执行情况(简单查询、子查询等),以及各类访问方法的具体含义。通过解释ID、类型和附加信息等相关字段的功能来展示SQL查询执行...

    mysql执行计划.md

    mysql执行计划.md

    Java高级试听课:MySQL 执行计划查看、索引失效分析、加锁分析.txt

    Java高级试听课:MySQL 执行计划查看、索引失效分析、加锁分析

Global site tag (gtag.js) - Google Analytics