在使用数据库时,可能会出现表对应字段已经创建了索引,但是SQL语句执行慢的情况。您可以使用EXPLAIN命令查看下对应的查询计划,从而可以快速定位慢SQL。

下图为您展示优化器从开始解析到最终执行的过程。

优化器介绍

语法

EXPLAIN 命令可以输出SQL 语句的查询计划,具体语法如下:

EXPLAIN [ ( option [, ...] ) ] statement
EXPLAIN [ ANALYZE ] [ VERBOSE ] statement

where option can be one of:
    ANALYZE [ boolean ]
    VERBOSE [ boolean ]
    COSTS [ boolean ]
    BUFFERS [ boolean ]
    TIMING [ boolean ]
    SUMMARY [ boolean ]
    FORMAT { TEXT | XML | JSON | YAML }
  • BUFFERS选项为TRUE会显示关于缓存的使用信息,默认为FALSE。该参数只能与ANALYZE 参数一起使用。缓冲区信息包括共享块(常规表或者索引块)、本地块(临时表或者索引块)和临时块(排序或者哈希等涉及到的短期存在的数据块)的命中块数,更新块数,挤出块数。
  • COSTS选项为TRUE会显示每个计划节点的预估启动代价(找到第一个符合条件的结果的代价)和总代价,以及预估行数和每行宽度,默认为TRUE。
  • VERBOSE选项为TRUE会显示查询计划的附加信息,默认为FALSE。附加信息包括查询计划中每个节点输出的列(Output),表的SCHEMA信息,函数的SCHEMA 信息,表达式中列所属表的别名,被触发的触发器名称等。
  • ANALYZE选项为TRUE会实际执行SQL,并获得相应的查询计划,默认为FALSE。如果优化一些修改数据的SQL 需要真实的执行但是不能影响现有的数据,可以放在一个事务中,分析完成后可以直接回滚。
  • FORMAT指定输出格式,默认为TEXT。各个格式输出的内容都是相同的,其中XML | JSON | YAML更有利于您通过程序解析SQL语句的查询计划。
  • SUMMARY选项为TRUE会在查询计划后面输出总结信息,例如查询计划生成的时间和查询计划执行的时间。当ANALYZE 选项打开时,它默认为TRUE。
  • TIMING选项为TRUE会显示每个计划节点的实际启动时间和总的执行时间,默认为TRUE。该参数只能与ANALYZE 参数一起使用。因为对于一些系统来说,获取系统时间需要比较大的代价,如果只需要准确的返回行数,而不需要准确的时间,可以把该参数关闭。