mysql 生成执行计划_MySQL执行计划

MySQL执行计划

EXPLAIN 语法

AAffA0nNPuCLAAAAAElFTkSuQmCC{EXPLAIN | DESCRIBE | DESC}

tbl_name [col_name | wild]{EXPLAIN | DESCRIBE | DESC}    [explain_type]

{explainable_stmt | FOR CONNECTION connection_id}

explain_type: {

EXTENDED  | PARTITIONS  | FORMAT = format_name

}

format_name: {

TRADITIONAL  | JSON

}

explainable_stmt: {    SELECT statement  | DELETE statement  | INSERT statement  | REPLACE statement  | UPDATE statement

}

AAffA0nNPuCLAAAAAElFTkSuQmCC

1. 使用EXPLAIN优化查询

EXPLAIN语句提供有关MySQL如何执行语句的信息:EXPLAIN适用于SELECT,DELETE,INSERT,REPLACE和UPDATE语句。

当EXPLAIN与可解释的语句一起使用时,MySQL会显示优化器中有关语句执行计划的信息。也就是说,MySQL解释了它将如何处理语句,包括有关表如何连接以及以何种顺序连接的信息。

当EXPLAIN与FOR CONNECTION connection_id将显示connection_id执行的语句的执行计划。

对于SELECT语句,EXPLAIN会生成可以使用SHOW WARNINGS显示的其他执行计划信息。

EXPLAIN对于检查涉及分区表的查询很有用。

FORMAT选项可用于选择输出格式。 TRADITIONAL以表格格式显示输出。如果没有显示定义FORMAT选项,则默认值为TRADITIONAL。 JSON格式以JSON格式显示信息。

在EXPLAIN的帮助下,可以看到应该向表添加索引的位置,以便通过使用索引查找行来更快地执行语句。还可以使用EXPLAIN来检查优化程序是否以最佳顺序连接表。要提示优化器使用与SELECT语句中命名表的顺序相对应的连接顺序,请使用SELECT STRAIGHT_JOIN而不是SELECT来开始语句。 (请参见“SELECT语法”。)但是,STRAIGHT_JOIN可能会阻止使用索引,因为它会禁用半连接转换。请参见“使用半连接转换优化子查询,派生表和视图引用”。

优化器trace有时可以提供与EXPLAIN的信息互补的信息。但是,优化程序跟踪格式和内容可能会在不同版本之间发生变化。有关详细信息,请参阅MySQL内部:跟踪优化程序。

如果在您认为应该使用索引时遇到问题,请运行ANALYZE TABLE以更新可能影响优化程序所做选择的表统计信息,例如key的基数。请参见“ANALYZE TABLE语法”。注意

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

2. EXPLAIN输出格式

EXPLAIN语句提供有关MySQL如何执行语句的信息。 EXPLAIN适用于SELECT,DELETE,INSERT,REPLACE和UPDATE语句。

EXPLAIN为SELECT语句中使用的每个表返回一行信息。 它按照MySQL在处理语句时读取它们的顺序列出输出中的表。 MySQL使用嵌套循环连接方法解析所有连接。 这意味着MySQL从第一个表中读取一行,然后在第二个表,第三个表中找到匹配的行,依此类推。 处理完所有表后,MySQL会通过表列表输出所选列和回溯,直到找到有更多匹配行的表。 从该表中读取下一行,并继续下一个表。

EXPLAIN输出包括分区信息。 此外,对于SELECT语句,EXPLAIN生成扩展信息,可以使用EXPLAIN后的SHOW WARNINGS显示.【注意】

在较旧的MySQL版本中,使用EXPLAIN PARTITIONS和EXPLAIN EXTENDED生成分区和扩展信息。 这些语法仍然可以向后兼容,但默认情况下现在启用分区和扩展输出,因此PARTITIONS和EXTENDED关键字是多余的并且已弃用。 它们的使用会导致警告,并且在将来的MySQL版本中它们将从EXPLAIN语法中删除。

您不能在同一个EXPLAIN语句中一起使用已弃用的PARTITIONS和EXTENDED关键字。 此外,这些关键字都不能与FORMAT选项一起使用。

2.1 EXPLAIN输出列

AAffA0nNPuCLAAAAAElFTkSuQmCCmysql> explain select * from employees.t1 where t1.emp_no in (select emp_no from employees.salaries);+----+--------------+-------------+------------+--------+----------------+------------+---------+---------------------+---------+----------+-------------+| id | select_type  | table       | partitions | type   | possible_keys  | key        | key_len | ref                 | rows    | filtered | Extra       |+----+--------------+-------------+------------+--------+----------------+------------+---------+---------------------+---------+----------+-------------+|  1 | SIMPLE       | t1          | NULL       | ALL    | NULL           | NULL       | NULL    | NULL                | 2837194 |   100.00 | Using where ||  1 | SIMPLE       |  | NULL       | eq_ref |      |  | 4       | employees.t1.emp_no |       1 |   100.00 | NULL        ||  2 | MATERIALIZED | salaries    | NULL       | index  | PRIMARY,emp_no | emp_no     | 4       | NULL                | 2838426 |   100.00 | Using index |+----+--------------+-------------+------------+--------+----------------+------------+---------+---------------------+---------+----------+-------------+3 rows in set, 1 warning (

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值