8.8.1 通过 EXPLAIN 来优化查询
EXPLAIN 语句会提供 MySQL 如何执行查询的信息:
-
EXPLAIN 可以对 SELECT,DELETE,INSERT,和 UPDATE 语句进行分析。
-
当对一个可分析的语句进行 EXPLAIN 操作时,MySQL 会显示优化器的查询执行计划,也就是 MySQL 会分析出如何处理这条语句,包括不同表之间时如何联合的。关于如何使用 EXPLAIN 来获取查询执行计划信息可以查阅 8.2 EXPLAIN 输出格式。
-
当 EXPLAIN 对
FOR CONNECTION connection_id
执行而不是对可分析语句执行的话,它会显示当前命名连接正在执行语句的执行计划,详情可查阅 8.8.4 获取命名连接的执行计划信息。 -
对于 SELECT 语句来说,EXPLAIN 会产生额外的查询执行计划信息,可以通过 SHOW WARNINGS 语句来获取这些额外信息。详情可查阅 8.8.3 扩展 EXPLAIN 输出格式。
-
EXPLAIN 对于考察分区数据表的查询非常有用。详情可查阅 23.3.5 Obtaining Information About Partitions
-
可以使用 FORMAT 选项来控制输出格式。TRADITIONAL 是默认的输出格式代表以表格的形式输出,JSON 会以 JSON 的格式输出数据。
通过 EXPLAIN ,可以知道在哪里添加索引来加速查找行,从而加速语句的执行。也可以通过 EXPLAIN 语句来检查优化器是否以最优的方式来联合表。使用 SELECT STRAIGHT_JOIN 语句代替 SELECT 语句,来让优化器按照指定的顺序来联合表,详情可查阅 13.2.10, “SELECT Statement”。使用 STRAIGHT_JOIN 的时候会禁用半联合转换,从而不能有效的使用索引。详情可查阅 [8.2.2.1 使用半联合转换优化 IN 和 EXIST 子查询]。
优化器追踪提供的信息有时可以和 EXPLAIN 互补。但是优化器追踪的输出格式会随着版本的变化而变化。关于优化器追踪的详细信息可查阅 MySQL Internals: Tracing the Optimizer.。
有时候在你明确已经使用了索引的时候,但执行计划中没有使用索引,你可以执行 ANALYZE TABLE 来更新表的统计信息(如键的基数等)从而改变优化器的选择。详细信息可查阅 13.7.3.1 ANALYZE TABLE Statement。
Note
EXPLAIN 也可以用于获取表的列信息。EXPLAIN tbl_name
和DESCRIBE tbl_name
、SHOW COLUMNS FROM tbl_name
的功能是一样的。详细信息可查阅 13.8.1 DESCRIBE Statement 和 13.7.7.5 SHOW COLUMNS Statement。