引言
本博客总结自MySQL 官网 Understanding the Query Execution Plan 专题。
根据我们的表、字段、索引、以及 where 子句中的条件等信息,MySQL 优化器会考虑各种技术来更高效地执行查找。一个大表中的查找不一定要读取所有记录;多表连接也不一定需要比较每条联合记录。优化器选择的执行最优查询的操作集,称为“查询执行计划”,也可以说是 EXPLAIN 计划。我们的目标就是找到那些可以将查询优化地更好的点,然后通过学习 SQL 语法和索引等技术,来改善执行计划。
一、什么是 EXPLAIN ?
EXPLAIN 语句提供了 MySQL 如何执行语句的信息:
1、EXPLAIN 可以和 SELECT DELETE INSERT REPLACE UPDATE 语句等一起工作;
2、当 EXPLAIN 和一个可被解释的语句一起使用时,MySQL 就会展示来自优化器的关于语句执行计划的信息。即,MySQL 会解释它将会怎样执行语句,包括表是如何连接、以什么方式排序等信息。
3、When EXPLAIN is used with FOR CONNECTION
rather than an explainable statement, it displays the execution plan for the statement executing in the named connection.connection_id
4、对于 SELECT 语句, EXPLAIN 提供了额外的执行计划信息,可以用 SHOW WARNINGS 来查看。
5、EXPLAIN对于检查涉及分区表的查询非常有用。
6、FORMAT 选项可以用于选择输出格式。TRADITIONAL 以表格的形式展示。如果没有指定 FORMAT 选项,那么TRADITIONAL 是默认的。JSON 格式会以 json 格式展示。
在 EXPLAIN 的帮助下,你可以清楚的知道为了让查询变得更快,该在哪里给表添加索引。你也可以知道优化器是否以最佳的顺序连接各个表。为了提示优化器使用与SELECT语句中表的命名顺序相对应的连接顺序,请以SELECT STRAIGHT_JOIN(而不是SELECT)开始该语句。However,STRAIGHT_JOIN
may prevent indexes from being used because it disables semijoin transformations
优化器跟踪有时可能提供与EXPLAIN互补的信息。但是,优化器跟踪格式和内容可能在版本之间发生变化。
如果你对本应该使用索引而没有用到索引的情况感到疑惑,执行一下 ANALYZE TABLE 来更新表统计信息。例如键的基数,这会影响优化器所做的选择。
注意:
EXPLAIN 还可以用来获取表中列的信息。 EXPLAIN 表名 与 DESCRIBE 表名 和 SHOW CLOUMS FROM 表名 是等价的。
(未完待续。。。。)
圣斗士Morty 发布了192 篇原创文章 · 获赞 282 · 访问量 52万+ 关注