10.8.1 使用 EXPLAIN 优化查询
EXPLAIN 语句提供了 MySQL 执行语句的信息:
-
当使用 EXPLAIN 语句时,MySQL 将显示优化器关于语句执行计划的信息。这意味着 MySQL 解释了它将如何处理语句,包括表的连接顺序等。有关使用 EXPLAIN 语句获取执行计划信息的信息,请参阅第10.8.2节,“EXPLAIN 输出格式”。
-
当使用 EXPLAIN 语句时,带有
FOR CONNECTION
而不是可解释的语句,它将显示该语句在指定连接中执行的计划。请参阅第10.8.4节,“获取指定连接的执行计划信息”。connection_id
-
对于
SELECT
语句,EXPLAIN 语句还提供了额外的执行计划信息,可以使用SHOW WARNINGS
显示。请参阅第10.8.3节,“Extended EXPLAIN 输出格式”。 -
EXPLAIN
对于涉及分区表的查询非常有用。请参阅第26.3.5节,“获取分区信息”。 -
可以使用
FORMAT
选项选择输出格式。TRADITIONAL
将输出结果以表格形式显示。这是默认格式,如果没有指定FORMAT
选项。JSON
格式将结果以 JSON 格式显示。
使用EXPLAIN
可以看到您应该在表中添加索引,以便使用索引来快速执行语句。您还可以使用EXPLAIN
来检查优化器是否将表连接在最优顺序中。要将优化器提示使用与SELECT语句中表名的顺序相同的连接顺序,可以从语句开始使用SELECT STRAIGHT_JOIN
,而不是SELECT
。(见第15.2.13节,“SELECT 语句”。)然而,STRAIGHT_JOIN
可能会阻止索引的使用,因为它会禁用半连接变换。见Optimizing IN and EXISTS Subquery Predicates with Semijoin Transformations。
优化器跟踪可能会提供与EXPLAIN
相同的信息。然而,优化器跟踪格式和内容可能会在不同版本之间发生变化。详见MySQL Internals: Tracing the Optimizer。
如果您遇到索引不被使用的问题,而您认为它们应该被使用,请运行ANALYZE TABLE
以更新表的统计信息,如键的卡度性,可以影响优化器的选择。见第15.7.3.1节,“ANALYZE TABLE 语句”。
EXPLAIN
也可以用来获取表中的列信息。EXPLAIN
与tbl_name
DESCRIBE
和tbl_name
SHOW COLUMNS FROM
相同。更多信息见第15.8.1节,“DESCRIBE 语句”,和第15.7.7.6节,“SHOW COLUMNS 语句”。tbl_name