dbeaver查看执⾏计划_MySQLSQL语法优化——使⽤Explain
查看执⾏计划
ajax和axios面试during翻译夜深,最近在写SQL优化的⼀些⽂章,看到私聊中,有很多⼈在问如何判断是否需要优化或者是如何查看MySQL执⾏计划,本⽂简要介绍⼀下MySQL EXPLAIN命令。
sustainable短语EXPLAIN命令是查看优化器如何决定执⾏查询的主要⽅法。通常,我们查看执⾏计划获取以下信息:
SQL如何使⽤索引
联接查询的执⾏顺序
查询扫描的数据⾏数
哪些索引可以使⽤
哪些索引被实际使⽤
MySQL Explain语法
如下
执⾏计划包含的信息
ID 说明
php软件安装步骤表⽰执⾏SELECT语句的顺序,ID相同时,执⾏顺序由上⾄下。如果是⼦查询,ID的序号会递增,ID越⼤优先级越⾼,越优先被执⾏。
SELECT_TYPE说明
SIMPLE:简单查询,即不包含⼦查询或是UNION操作的查询。
PRIMARY:最外层查询,即查询中包含任何⼦查询,则最外层的查询则被标记为PRIMARY。
SUBQUERY:映射为⼦查询,即在SELECT 或 WHERE列表中包含了⼦查询 。
DEPENDENT SUBQUERY:依赖外部结果的⼦查询。
DERIVED:⼦查询,即出现在FROM⼦句中的⼦查询。
UNION:联合,若第⼆个SELECT出现在UNION之后,则被标记为UNION。若UNION包含在FROM⼦句的⼦查询中,外层SELECT将被标记为DERIVED。
UNION RESULT:使⽤联合的结果,即UNION产⽣的结果集。
TABLE 说明
指的就是当前执⾏的表,即输出数据⾏所在的表的名称。由ID为M,N查询union产⽣的结果集,或者是由ID为N的查询产⽣的结果。
TYPE 说明
if和and函数如何嵌套ALL:全数据表扫描 ,遍历全表以到匹配的⾏,效率最差。
INDEX:全索引表扫描,INDEX与ALL区别为index类型只遍历索引树。
RANGE:对索引列进⾏范围查,只检索给定范围的⾏,使⽤⼀个索引来选择⾏,常见于BETWEEN、>、
INDEX_MERGE:合并索引,使⽤多个单列索引搜索。
REF:使⽤⾮唯⼀索引扫描或者唯⼀索引的前缀扫描,返回匹配某个单独值的数据⾏,然⽽他可能会到多个符合条件的⾏,所以它应该属于查和扫描的混合体 。
EQ_REF:唯⼀性索引扫描,对于每个索引键,表中只有⼀条数据与之匹配。常见于主键 或 唯⼀索引扫描。
CONST:表中有且只有⼀个匹配的⾏时使⽤。因为仅有⼀⾏,在这⾏的列值可被优化器剩余部分认为是常数,如对主键或是唯⼀索引的查询,效率最⾼的联接⽅式。
SYSTEM:SYSTEM是CONST类型的特例,即当查询的表只有⼀⾏的情况下(等于系统表)。
NULL: MySQL在优化过程中分解语句,执⾏时甚⾄不⽤访问表或索引,例如从⼀个索引列⾥选取最⼩值可以通过单独索引查完成。性能排序如下:
⼀般来说,得保证查询⾄少达到RANGE级别,最好能达到REF。
POSSIBLE_KEYS 说明
可能使⽤的索引,指出MySQL能使⽤哪些索引来优化查询,查询涉及到的字段上若存在索引,则该索引将被列出,但不⼀定被查询使⽤。
KEY 说明
KEY 列显⽰MySQL实际决定使⽤的索引,如果没有可⽤的索引,则显⽰为NULL。如查询使⽤了覆盖索引,则该索引仅出现在Key列中。要想强制MySQL使⽤或忽视POSSIBLE_KEYS 列中的索引,在查询中使⽤FORCE INDEX、USE INDEX或者IGNORE INDEX。
KEY_LEN 说明
表⽰索引中使⽤的字节数,可通过该列计算查询中使⽤的索引的长度,KEY_LEN 显⽰的值为索引字段的最⼤可能长度,理论上长度越短越好,但并⾮实际使⽤长度,即KEY_LEN 是根据表定义计算⽽得,⽽不是通过表内检索出的。
REF 说明
表⽰上述表的连接匹配条件,即表⽰哪些列或常量被⽤于查索引列上的值。
ROWS 说明
表⽰MySQL根据表统计信息及索引选⽤情况,估算的到所需的数据所需要读取的⾏数,ROWS值的⼤⼩是个统计抽样结果,并不完全准确。
Extra 说明
不适合在其他列中显⽰,但⼜很重要的额外信息,有以下⼏种情况:
using index:使⽤了覆盖索引(Covering Index)进⾏查询,以避免访问表。
using where:MySQL将在存储引擎检索⾏后再进⾏过滤。许多WHERE条件⾥涉及索引中的列,当它读取索引时,就能被存储引擎检验,因此不是所有带WHERE⼦句的查询都会显⽰"using where"。
using temporary:MySQL需要使⽤临时表来存储结果集,常见于排序、⼦查询和分组查询。
using filesort:MySQL中⽆法利⽤索引完成的排序操作称为⽂件排序。MySQL有两种⽂件排序⽅式,都可以在内存或者磁盘上完成, 通常会出现在ORDER BY或GROUP BY查询中。
not exists:使⽤Not Exists来优化查询。
select tables optimized away:直接通过索引来获取数据,不⽤访问表。
Using join buffer:表⽰在获取连接条件时没有使⽤索引,并且需要连接缓冲区来存储中间结果。如果出现了这个值,应该注意,根据查询的具体情况可能需要添加索引来改进性能。
引发索引失效,导致全表扫描的原因有:
索引列进⾏计算、函数、类型转换等操作。
索引列使⽤不等于,如!= 或<>。
索引列使⽤ IS NULL ,IS NOT NULL。
模糊查询LIKE 以通配符开头如,%ab。
索引列使⽤使⽤ OR 来连接条件。
索引列使⽤IN 和 NOT IN 。
隐式转换,类型错误,如字段NUM类型为varchar,WHERE条件⽤number,NUM = 1。
WHERE⼦句和ORDER BY使⽤相同的索引,并且ORDER BY的顺序和索引顺序相同,并且ORDER BY的字段都是升序或者降序,否则不会使⽤索引。
复合索引不符合最佳左前缀原则或存在断点。
如果MYSQL评估使⽤索引⽐全表扫描更慢,则不使⽤索引。
索引失效优化技巧
可阅读:⽇拱⼀卒,SQL语法优化⽅法及实例详解
SQL 执⾏顺序
可阅读:SQL查询语句的执⾏顺序解析
mysql面试题sql优化
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论