Skip to main content

1.使用 EXPLAIN 优化查询

根据表、列、索引的详细信息以及 WHERE 子句中的条件,MySQL 优化器会考虑多种技术来有效地执行 SQL 查询中涉及的查找。 对大表进行查询无需读取所有行; 可以执行涉及多个表的联接,而无需比较每个行组合。 优化器选择执行最有效查询的操作集称为“查询执行计划”,也称为 EXPLAIN 计划。

使用 EXPLAIN 优化查询

EXPLAIN 语句提供有关 MySQL 如何执行语句的信息:

  • EXPLAIN 与 SELECT、DELETE、INSERT、REPLACE 和 UPDATE 语句配合使用。
  • 当 EXPLAIN 与可解释语句一起使用时,MySQL 显示来自优化器的有关语句执行计划的信息。 也就是说,MySQL 解释了它将如何处理该语句,包括有关表如何连接以及连接顺序的信息。
  • 当 EXPLAIN 与 FOR CONNECTION connection_id 而不是可解释语句一起使用时,它会显示在指定连接中执行的语句的执行计划。
  • 对于 SELECT 语句,EXPLAIN 生成可以使用 SHOW WARNINGS 显示的附加执行计划信息。
  • EXPLAIN 对于检查涉及分区表的查询很有用。
  • FORMAT 选项可用于选择输出格式。 传统以表格格式呈现输出。 如果不存在 FORMAT 选项,则这是默认值。 JSON 格式以 JSON 格式显示信息。

在 EXPLAIN 的帮助下,可以了解应该在表的何处添加索引,以便通过使用索引查找行来加快语句的执行速度。 还可以使用 EXPLAIN 检查优化器是否以最佳顺序连接表。 要提示优化器使用与 SELECT 语句中表命名顺序相对应的连接顺序,请以 SELECT STRAIGHT_JOIN 而不仅仅是 SELECT 开始语句。 但是,STRAIGHT_JOIN 可能会阻止使用索引,因为它禁用半连接转换。

优化器跟踪有时可能会提供与 EXPLAIN 信息互补的信息。 但是,优化器跟踪格式和内容可能会在版本之间发生变化。

如果遇到索引在应该使用时却未被使用的问题,请运行 ANALYZE TABLE 来更新表统计信息,例如键的基数,这可能会影响优化器所做的选择。

EXPLAIN 还可用于获取有关表中列的信息。 EXPLAIN tbl_name 与 DESCRIBE tbl_name 和 SHOW COLUMNS FROM tbl_name 同义。