【翻译】使用EXPLAIN优化MySQL查询

原文链接:http://dev.mysql.com/doc/refman/5.7/en/using-explain.html

EXPLAIN语句可以用于获取MySQL如何执行一条语句的相关信息:

  • EXPLAIN适用的可解释语句包括SELECTDELETEINSERTREPLACEUPDATE

  • 当对可解释语句使用EXPLAIN时,MySQL会显示优化器中的语句执行计划相关的信息。也就是说,MySQL将会解释它将如何处理语句,包括表如何进行联接操作,以及用何种方式进行排序等相关信息。若要了解如何使用EXPLAIN来获取执行计划信息,请参考《EXPLAIN语句输出格式》。

  • 当对FOR CONNECTION connection_id语句而不是可解释语句使用EXPLAIN时,它会显示在指定连接中执行的语句的执行计划。请参考《获取指定连接的执行计划信息》。

  • 在MySQL的5.7.3版本之前,可以使用EXPLAIN EXTENDED语句来获取额外的执行计划信息。请参考《EXPLAIN EXTENDED语句的输出格式》。从MySQL的5.7.3版本开始,扩展输出是默认启用的,不需要再使用EXTENDED关键字。

  • 在MySQL的5.7.3版本之前,EXPLAIN PARTITIONS语句可用于检查涉及分区表的查询。请参考《获取分区的有关信息》。从MySQL的5.7.3版本开始,分区信息是默认启用的,不需要再使用PARTITIONS关键字。

  • FORMAT选项可用于选择输出格式。TRADITIONAL格式会以表格形式显示输出信息。如果没有使用FORMAT选项,那么这将会是默认的显示格式。JSON格式将会以JSON格式显示输出信息。若FORMAT = JSON,那么输出信息会包含扩展信息和分区信息。

EXPLAIN的帮助之下,你会发现应当在何处为表添加索引,如果通过索引来查找行,那么将会大幅提升查询语句的执行速度。你还可以使用EXPLAIN来检查优化器是否以一种优化顺序将表联接起来。如果想要提醒优化器按照SELECT语句中的表的出现顺序来决定联接顺序,那么请使用SELECT STRAIGHT_JOIN语句,而不是SELECT语句。(请参考《SELECT语句的语法》。)

优化器跟踪有时候可以提供一些补充信息,这些信息是EXPLAIN不会提供的。但是,优化器跟踪的输出格式和内容会随着版本改变而不同。若要了解详情,请参考《MySQL内部原理:跟踪优化器》。

当你确信应当使用某些索引,但实际上并没有用到这些索引时,你可以运行ANALYZE TABLE语句来更新表的统计信息(例如,键值基数),这些信息可能会影响优化器作出的决策。请参考《ANALYZE TABLE语句的语法》。

注意

EXPLAIN还可以用于获取表中列的相关信息。EXPLAIN tbl_name语句是DESCRIBE tbl_name语句和SHOW COLUMNS FROM tbl_name语句的同义词。若要了解更多信息,请参考《DESCRIBE语句的语法》和《SHOW COLUMNS语句的语法》。