精华内容
下载资源
问答
  • 1 Explain[1]执行计划Mysql在执行SQL语句时,如何知道表的读取顺序,读取数据类型操作过程,哪些索引被使用到,这些都对SQL调优有着重要的作用.Explain作为查看执行计划的重要工具,分析Explain结果,对SQL调优有...

    1 Explain[1]执行计划

    Mysql在执行SQL语句时,如何知道表的读取顺序,读取数据类型操作过程,哪些索引被使用到,这些都对SQL调优有着重要的作用.Explain作为查看执行计划的重要工具,分析Explain结果,对SQL调优有重要意义。

    下面是使用explain 的例子:

    explain select * from mysql.user;

    --query result

    +----+-------------+-------+------------+------+---------------+------+---------+------+------+----------+-------+

    | id | select_type | table | partitions | type |possible_keys | key | key_len | ref | rows | filtered | Extra |

    +----+-------------+-------+------------+------+---------------+------+---------+------+------+----------+-------+

    | 1 |SIMPLE | user | NULL | ALL | NULL | NULL | NULL | NULL | 26 | 100.00 | NULL |

    +----+-------------+-------+------------+------+---------------+------+---------+------+------+----------+-------+

    其中最重要的字段为:id、type、key、rows、Extra注:Explain 有两个变种:explain extended:在explain的基础上额外提供一些查询优化的信息.额外有filtered列,是一个半分比的值,rows * filtered/100可算出,和explain中前一个表的连接行数(前一个表指 explain 中的id值比当前表id值小的表)。

    接着通过showwarnings命令得到优化后的查询语句。explain partitions:在explain的基础上额外提供一些查询优化的信息.额外有partitions列,如果查询是基于分区表的话,会显示查询将访问的分区。

    2 字段详解

    2.1 id

    id是理解SQL执行的顺利标识,SQL的执行顺序由大到小。id相同:执行顺序由上至下;

    id不同:如果是子查询,id的序号会递增,id值越大优先级越高,越先被执行.

    2.2 select_type

    查询的类型,主要是用于区分普通查询、联合查询、子查询等复杂的查询。SIMPLE:简单的select查询,查询中不包含子查询或者UNION;

    PRIMARY:查询中包含任何复杂的子部分,最外层查询则被标记为primary;

    SUBQUERY:在select 或 where列表中包含子查询;

    DEPENDENT SUBQUERY:子查询中的第一个SELECT,取决于外面的查询;

    DERIVED:在from列表中包含子查询被标记为derived(衍生),mysql或递归执行这些子查询;

    UNION:第二个select出现在UNION之后,则被标记为UNION;

    DEPENDENT UNION:UNION中的第二个或后面的SELECT语句,取决于外面的查询;

    UNION RESULT:UNION的结果。

    2.3 table

    值表示 explain 的一行正在访问表名。

    2.4 type

    表示关联类型或访问类型,即MySQL决定如何查找表中的行。

    访问类型,sql查询优化中一个很重要的指标,结果值从好到坏依次是: system >const > eq_ref > ref > fulltext > ref_or_null > index_merge >unique_subquery > index_subquery > range > index > ALL

    一般而言,良好的sql查询至少达到range级别,最好能达到ref级别。system:表只有一行记录(等于系统表),这是const类型的特例,平时不会出现,可以忽略不计;

    const:表示通过索引一次就找到了,const用于比较primary key 或者 unique索引。因为只需匹配一行数据,所有很快。如果将主键置于where列表中,mysql就能将该查询转换为一个const

    eq_ref:唯一性索引扫描,对于每个索引键,表中只有一条记录与之匹配。常见于主键或 唯一索引扫描。=》primarykey 或 unique key 索引的所有部分被连接使用,最多只会返回一条符合条件的记录。这可能是在 const 之外最好的联接类型了,简单的 select 查询不会出现这种 type。

    注意:ALL全表扫描的表记录最少的表如t1表ref:相比 eq_ref,不使用唯一索引,而是使用普通索引或者唯一性索引的部分前缀,索引要和某个值相比较,可能会找到多个符合条件的行。

    ref_or_null:类似ref,但是可以搜索值为NULL的行。

    index_merge:表示使用了索引合并的优化方法。 例如下表:id是主键,tenant_id是普通索引。or 的时候没有用 primary key,而是使用了 primary key(id) 和 tenant_id 索引.

    range:范围扫描通常出现在 in(), between ,> ,= 等操作中。使用一个索引来检索给定范围的行。

    index:Full Index Scan,index与ALL区别为index类型只遍历索引树。这通常为ALL块,应为索引文件通常比数据文件小。(Index与ALL虽然都是读全表,但index是从索引中读取,而ALL是从硬盘读取)

    ALL:Full Table Scan,遍历全表以找到匹配的行

    2.5 possible_keys

    这列显示查询可能使用哪些索引来查找。

    2.6 key

    这列显示mysql实际采用哪种索引,从而进一步优化对该表的访问。

    2.7 key_len

    表示索引中使用的字节数,查询中使用的索引的长度(最大可能长度),并非实际使用长度,理论上长度越短越好。

    2.8 ref

    显示索引的那一列被使用了,如果可能,是一个常量const。

    这一列显示了在key列记录的索引中,表查找值所用到的列或常量,常见的有:const(常量),func,NULL,字段名(例:film.id)

    2.9 rows

    根据表统计信息及索引选用情况,大致估算出找到所需的记录所需要读取的行数

    2.10 ExtraUsing filesort:MySQL有两种方式可以生成有序的结果,通过排序操作或者使用索引,当Extra中出现了Using filesort 说明MySQL使用了后者,但注意虽然叫filesort但并不是说明就是用了文件来进行排序,只要可能排序都是在内存里完成的。大部分情况下利用索引排序更快,所以一般这时也要考虑优化查询了。使用文件完成排序操作,这是可能是ordery by,group by语句的结果,这可能是一个CPU密集型的过程,可以通过选择合适的索引来改进性能,用索引来为查询结果排序。

    Using temporary:用临时表保存中间结果,常用于GROUP BY 和 ORDER BY操作中,一般看到它说明查询需要优化了,就算避免不了临时表的使用也要尽量避免硬盘临时表的使用。

    Not exists:MYSQL优化了LEFT JOIN,一旦它找到了匹配LEFT JOIN标准的行, 就不再搜索了。

    Using index:说明查询是覆盖了索引的,不需要读取数据文件,从索引树(索引文件)中即可获得信息。如果同时出现using where,表明索引被用来执行索引键值的查找,没有using where,表明索引用来读取数据而非执行查找动作。这是MySQL服务层完成的,但无需再回表查询记录。

    Using index condition:这是MySQL 5.6出来的新特性,叫做“索引条件推送”。简单说一点就是MySQL原来在索引上是不能执行如like这样的操作的,但是现在可以了,这样减少了不必要的IO操作,但是只能用在二级索引上。

    Using where:使用了WHERE从句来限制哪些行将与下一张表匹配或者是返回给用户。注意:Extra列出现Using where表示MySQL服务器将存储引擎返回服务层以后再应用WHERE条件过滤。

    Using join buffer:使用了连接缓存:Block Nested Loop,连接算法是块嵌套循环连接;Batched Key Access,连接算法是批量索引连接

    impossible where:where子句的值总是false,不能用来获取任何元组

    select tables optimized away:在没有GROUP BY子句的情况下,基于索引优化MIN/MAX操作,或者对于MyISAM存储引擎优化COUNT(*)操作,不必等到执行阶段再进行计算,查询执行计划生成的阶段即完成优化。

    distinct:优化distinct操作,在找到第一匹配的元组后即停止找同样值的动作

    参考资料

    [1]

    展开全文
  • 怎么进行autotrace进行查看执行计划
  • mysql 获取执行计划方法:1.通过explain进行查看sql的执行计划;2.通线程正在执行的sql查看该sql的执行计划;explain进行查看sql的执行计划相对简单,其实通线程正在执行的sql查看执行计划也很简单,那么为什么还...

    mysql 获取执行计划方法:

    1.通过explain进行查看sql的执行计划;

    2.通线程正在执行的sql查看该sql的执行计划;

    explain进行查看sql的执行计划相对简单,其实通线程正在执行的sql查看执行计划也很简单,那么为什么还需要第二种方式呢?

    因为日常工作会发现很多sql一直在执行,执行发生异常,如果把该sql拿出来执行又很快,于是我们想获取该sql执行异常时候的执行计划,同时因为数据在时刻的变化,统计信息也有可能变化,有可能导致执行计划发生改变,好在mysql5.7开始已经可以通过正在执行的线程查看该sql的执行计划,不需要把sql拿出来执行获取执行计划,这样就可以很好的还原真相:

    show processlist;或者select * from information_schema.PROCESSLIST where info is not null order by time desc ;查看。

    mysql> select from information_schema.PROCESSLIST where info is not null;

    +-----+------+-----------------+------+---------+------+--------------+-----------------------------------------------------------------------+

    | ID | USER | HOST | DB | COMMAND | TIME | STATE | INFO |

    +-----+------+-----------------+------+---------+------+--------------+-----------------------------------------------------------------------+

    | 17 | root | localhost | NULL | Query | 0 | executing | select from information_schema.PROCESSLIST where info is not null |

    | 178 | root | localhost:60124 | app1 | Query | 560 | Sending data | select count(*) from t ,t_adress where t.adress = t_adress.adress |

    +-----+------+-----------------+------+---------+------+--------------+-----------------------------------------------------------------------+

    2 rows in set (0.00 sec)

    mysql> EXPLAIN FOR CONNECTION 178;

    +----+-------------+----------+------------+------+---------------+------+---------+------+--------+----------+----------------------------------------------------+

    | id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra |

    +----+-------------+----------+------------+------+---------------+------+---------+------+--------+----------+----------------------------------------------------+

    | 1 | SIMPLE | t_adress | NULL | ALL | NULL | NULL | NULL | NULL | 200096 | 100.00 | NULL |

    | 1 | SIMPLE | t | NULL | ALL | NULL | NULL | NULL | NULL | 309664 | 100.00 | Using where; Using join buffer (Block Nested Loop) |

    +----+-------------+----------+------------+------+---------------+------+---------+------+--------+----------+----------------------------------------------------+

    2 rows in set (0.01 sec)

    使用起来是不是很方便?

    最后说一句:今天心里很憋屈,睡觉了。。。。。。。。

    展开全文
  • 怎么执行计划执行计划里有什么? 索引失效的原因: 索引列进行运算; 针对索引使用函数; 对索引列使用隐式转换; 用 != 和null 判断; like ‘%-’ 百分号在前; 看执行计划: 执行一条SQL语句后...

    索引失效的有哪些?怎么看执行计划,执行计划里有什么?

    索引失效的原因:

           索引列进行运算;

           针对索引使用函数;

           对索引列使用隐式转换;

           用 != 和null 判断;

           like ‘%-’ 百分号在前;

    看执行计划: 执行一条SQL语句后,按F5可以查询该SQL语句的执行计划

    执行计划主要关注:

           基数(当前操作返回结果集的行数)

          字节(执行该步骤后返回的字节数)

         CPU耗费(执行该步骤的执行成本)

          时间(当前操作所需的时间)

    展开全文
  • 怎么看mysql执行计划

    2021-03-23 20:17:23
    这时候,我们就需要查看sql的执行计划,以此来分析sql执行缓慢的问题所在。 如何查看mysql执行计划 方法一:使用explain(推荐) explain select * from t_user; 方法二:使用Navicat解释执行 执行计划...

    前言

          mysql是关系型数据库中比较流行的一款数据库。在工作中使用mysql,难免会遇到sql执行缓慢的情况。这时候,我们就需要查看sql的执行计划,以此来分析sql执行缓慢的问题所在。

    如何查看mysql执行计划

    方法一:使用explain(推荐)

    explain select * from t_user;

    方法二:使用Navicat解释执行

    执行计划结果

    下面,我们依次解析每个字段的含义。

    id(重要)

    表示表的读取顺序,分为两种情况:

    • id相同,读表顺序从上往下
    • id不同,优先读取id大的

    举例1: id相同,先读取表t2(t_user_age),再读取表t1(t_user)

    举例2:id不同,从大到小,所以先读取t_user_age, 再读取子查询的衍生表,最后读取t_user表。

    select_type

    查询类型,有如下类型:

    • simple           简单语句,不包含子查询或者union
    • primary         若语句包含复杂查询,则语句的最外层为primary
    • subquery       在select或者where中包含子查询
    • derived          在from中包含的子查询为derived(衍生表)
    • union             在union之后的查询,被标记为union类型
    • union result   从union获取结果的select查询
    • 其余类型。。。

    举例1:simple类型

    举例2: union,union result, primary

    table

    如题,表示表名

    type(重要)

    索引类型, 有很多种,常见的类型按照性能从差到好为:

    all < index < range < ref < eq_ref < const < system

    • all                   表示全表扫描,性能最差
    • index              走索引,扫描了索引文件的全部数据
    • range             走索引,索引列使用了范围查找,如between, in, <, >
    • ref                  表示非唯一性索引
    • eq_ref            表示唯一索引
    • const              一次就找到数据的唯一索引
    • system           只有一条数据的系统表

    在实际业务中,sql能使用到range, ref级别的索引就算是比较好的了。

    possible_keys

    mysql分析可能使用到的索引,实际不一定会用到。

    key(重要)

    实际使用的索引,key有值才表示真的用到了索引

    key_len

    使用到的索引长度,根据索引组合字段类型所占的字节数来计算。在能找到正确数据的情况下,长度越短越好。

    ref

    哪些列或常量被用于查找索引列上的值,即索引列=ref值。值有:

    • const       常量
    • 表的列     

    rows(重要)

    mysql估算的找到满足条件的记录所需要读取的行数,越少越好。

    extra(重要)

    mysql将执行计划的其他信息放到extra中。常见的有:

    1. Using filesort                             排序没有用到索引(重要,能使用索引排序是更好的)
    2. Using temporary                       使用了临时表保存中间结果,mysql在对查询结果排序时使用临时表,常见于order by 和group by(重要,使用临时表降低性能,最好排除掉)
    3. Using index                              表明select查询使用了覆盖索引(即只查索引文件就找到了需要的数据,不再需要访问表)
    4. Using where                             表示使用了where查询条件
    5. Using join buffer                       表示表join关联使用到了缓存
    6. impossible where                     表示where条件永远是false,拿不到数据
    7. using index condition               使用了索引条件

    结论

    分析执行计划,重点关注id, type, key, rows, extra信息。id查看表加载顺序,type查看索引类型,key查看使用的具体索引,rows关注查找结果所需遍历的数据量大不大,extra关注其他一些影响性能的关键信息。

    欢迎关注我的公众号,不定期分享java文章,一起学习进步。

     

    展开全文
  • ————————Created by Tangyun[Tony.Tang]————————2、固定执行计划为 1639688791。SQL> select sql_handle, plan_name, accepted, fixed,optimizer_cost from dba_sql_plan_baselines ;no row...
  • 本文是对于MySQL执行计划的解析,主要解释了MySQL执行计划中的各个参数及含义。十三、Extra产生的值存在六种情况:Using filesort、Using temporary、use index、using where、using join buffer、impossible where1...
  • 年轻就要醒着拼“我不怕死 只是不想这么活而你,还想那么活吗?...”目标:计算SQL执行每一步的资源消耗1、查看每一步的执行计划(DBMS_XPLAN.DISPLAY)测试工具:PL/SQL举例explain plan for select a.polno ...
  • EXPLAIN语句提供有关MySQL如何执行语句的信息。EXPLAIN与SELECT,DELETE,INSERT,REPLACE和UPDATE语句一起使用。EXPLAIN为SELECT语句中使用的每个表返回一行信息。它按照MySQL在处理语句时读取它们的顺序列出了输出...
  • 译者 林锦森 · 沃趣科技数据库技术专家出品 沃趣科技看懂执行计划是作为处理数据库性能问题的必备技能之一,接下来一系列的文章我会告诉你怎么去做。我们会从一些文章开始讨论几种获取执行计划的方法,并且评估不同...
  • sql sever怎么查看执行计划

    千次阅读 2018-03-19 09:14:43
    1、输入sql语句,点击“查询-显示估计的执行计划”简解执行计划的结果Logical OperationEstimated Operator Cost 估计运算符开销Estimated I/O Cost 估计I/O开销Estimated Subtree Cost 估计字数大小Estimated CPU ...
  • mysql的执行计划EXPLAIN SELECT * from employees where employees.gender='M'返回的结果如下:id是一组数字,表示查询中执行select子句或操作表的顺序。如果id相同,则执行顺序从上至下。如果是子查询,id的序号会...
  • 覆盖索引: MySQL可以利用索引返回select列表中的字段,而不必...不可select *,因为如果将所有字段一起做索引会导致索引文件过大,查询性能下降EXPLAIN查看执行计划的一些局限:EXPLAIN不会告诉你关于触发器、存储...
  • 这条SQL执行4分钟,message_message有数据1000w,学写了下mysql的执行计划。 在开发的过程中随着数据量的增大而感受到数据库的性能比较差从而延伸到响应速度慢,如果是开发人员很多时候估计是处于一种茫然状态,...
  • mysql执行计划怎么

    2016-04-01 17:26:05
    转载 ...将执行计划“反编译”成SELECT语句,运行SHOW WARNINGS 可得到被MySQL优化器优化后的查询语句 2. EXPLAIN PARTITIONS SELECT …… 用于分区表的EXPLAIN 执行计划包含的信息   ...
  • mysql的执行计划怎么看1、执行计划中包含的信息 ​ 在企业的应用场景中,为了知道优化SQL语句的执行,需要查看SQL语句的具体执行过程,以加快SQL语句的执行效率。 ​ 可以使用explain+SQL语句来模拟优化器执行SQL...
  • 如何通过PLSQL Developer查看执行计划的Starts | E-Rows | A-Rows这几个列呢其中的starts代码执行次数,E-Rows是估计返回的行,A-Rows是runtime时实际返回行SQL代码设定了gather_plan_statistics也没有显示设置里面...
  • mysql的查看执行计划的语句很简单,explain+你要执行的sql语句就OK了。举一个例子EXPLAIN SELECT * from employees where employees.gender='M'返回的结果如下: 这些结果都代表什么?id是一组数字,表示查询中执行...
  • 1.使用下面的关键词放在查询语句的前面 explain plan for select * from emp where deptno=10;2.查看执行计划表 select * from table(dbms_xplan.display);
  • 什么是执行计划怎么用? 加粗样式 执行计划是一条查询语句在oracle中的执行过程或者访问路径的描述。 在sql窗口执行完一条select 语句后按F5即可查看刚刚执行的这条查询语句的执行计划执行计划的常用列字段...
  • 概述一直以为 会写SQL, 是最实在的基础,会写SQL了,才会优化SQL,会优化SQL,才知道怎么设计表结构,进而设计更加精妙的业务类型, 业务类型就大致知道IO的大致规律。 从而知道更加复杂的架构模型。好了废话不多说...
  • 怎么稳固执行计划 所谓执行计划,顾名思义,就是对一个查询任务,做出一份怎样去完成任务的详细方案。举个生活中的例子,我从珠海要去英国,我可以选择先去香港然后转机,也可以先去北京转机,或者去广州也可以。...
  • 一、查看执行计划的方法有多种,依次如下: 1、打开熟悉的查看工具:PL/SQL Developer。 在PL/SQL Developer中写好一段SQL代码后,按F5,PL/SQL Developer会自动打开执行计划窗口,显示该SQL的执行计划。 2、...
  • 执行计划

    2018-11-22 17:43:00
    要理解执行计划怎么也得先理解,那各种各样的名词吧。鉴于自己还不是很了解。本文打算作为只写懂的,不懂的懂了才写。  在开头要先说明,第一次看执行计划要注意,SQL Server的执行计划是从右向左看的。  名词...
  • 这次选用的数据库是sql server,如果大家想要看mysql的执行计划,也可以上百度去找mysql如何查看执行计划,但是这篇博客主要是分析怎么执行计划。 查看执行计划 在navicat上面查看 先点击1,运行你的sql语句,然后...
  • 看懂执行计划是作为处理数据库性能问题的必备技能之一,接下来一系列的文章我会告诉你怎么去做。 我们会从一些文章开始讨论几种获取执行计划的方法,并且评估不同来源的执行计划最适合哪种场景。完成上述的内容后...
  • 教你怎么查看 hive 的执行计划

    千次阅读 2020-03-06 16:21:37
    我们在总结Hive架构的时候,我们知道Hive中有一个Compiler组件,这个组件主要是解析字符串的SQL,然后生成执行计划,我们介绍文章主要是详细讲解Compiler中的细节以及生成的执行计划 我们从下面的HiveSQL语句开始: ...
  • ExplainPlanWindow,在窗口中执行sql可以查看计划结果。其中,Cost表示cpu的消耗,单位为n%,Cardinality表示执行的行数,等价Rows。2、先执行EXPLAIN PLAN FORselect * fromtableAwhere paraA=1,再 select * fr...
  • 前言在MySQL中,我们可以通过EXPLAIN命令获取MySQL如何执行SELECT语句的信息,包括在SELECT语句执行过程中表如何连接和连接的顺序。下面分别对EXPLAIN命令结果的每一列进行说明:.select_type:表示SELECT的类型,...
  • 1 Explain[1]执行计划Mysql在执行SQL语句时,如何知道表的读取顺序,读取数据类型操作过程,哪些索引被使用到,这些都对SQL调优有着重要的作用.Explain作为查看执行计划的重要工具,分析Explain结果,对SQL调优有...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,922
精华内容 768
关键字:

怎么执行计划