引言

日常工作中,使用MySQL的机会还是蛮多的,主要考虑Schema与数据类型优化、如何创建索引、根据业务场景的查询优化。这些想必大家都在高性能MySQL这本书中看过,可能也比作者理解的深,本文旨在对EXPLAIN语句使用、分析进行整理。

(想自学习编程的小伙伴请搜索圈T社区,更多行业相关资讯更有行业相关免费视频教程。完全免费哦!)

EXPLAIN语句是什么?

官网对于EXPLAIN的作用定义如下:

The EXPLAIN statement provides information about how MySQL executes statements. EXPLAIN works with SELECT, DELETE, INSERT, REPLACE, and UPDATE statements.

简单来讲,EXPLAIN语句告诉我们MySQL如何执行SQL语句,而我们通过这些信息,可以达到优化SQL语句执行效率的目的。

接下来,就要对EXPLAIN返回的格式进行了解了,具体如下:

字段名字段描述
id查询语句内SELECT的序列号
select_typeSELECT类型
table访问的表名
partitions命中分区
type数据访问类型,下文详细介绍
possible_keys有关索引,实际情况可能不可用
keyMySQL查询优化器实际使用的索引
key_len索引存储长度
ref实际使用的索引中,用于比较的常量或列
rows查询需要读取的行数,innodb引擎是一个衡量效率的指标,有时可能不准确
Extra查询执行的附加信息,下文详细介绍
  • 在分析SQL语句执行时,主要用到的列,分别为type、Extra,下文的测试用例均为官网提供的sakila数据库,附上下载链接。

  • 本文使用MySQL 8.0.12、Navicat 12.1

type列主要出现值(性能从好到差)

  • system:表只有一行,const类型的特殊情况。
  • const:查询结果最多有一行,多为主键、唯一索引与常量比较的情况。
    explain select * from actor where actor_id = 1
  • eq_ref:一种特殊的索引查找,MySQL知道最多只返回一条符合条件的记录,使用主键、NOT NULL的唯一索引会看到(用navicat发现结果也是ref)。
   explain select * from actor, film_actor where actor.actor_id = film_actor.actor_id and actor.actor_id = 1
  • ref:一种索引查找,返回所有匹配某个单个值的行,然而,可能会找到多个符合条件的行,当使用非唯一性索引或者唯一性索引的非唯一性前缀时发生。
explain select * from film where title= 'ACE GOLDFINGER'
  • range:范围扫描就是一个有限制的索引扫描, 不用遍历所有索引,例如索引在BETWEEN、>、>范围内的。
explain select * from film where film_id BETWEEN 1 AND 100
  • index:全表扫描,只是MySQL扫描表时按索引次序而不是行。

Extra列中看到“Using index”,说明是覆盖索引,只需要读取索引列,不需要读取行数据。 使用索引次序全表读取。


explain select actor.actor_id from film_actor, actor where film_actor.actor_id = actor.actor_id 
  • ALL:全表扫描,读取行数据,找到需要的行。
explain select * from film_actor, actor where film_actor.actor_id = actor.actor_id 

Extra列主要出现的值

  • Using index:使用覆盖索引,避免回表查询行数据。
  • Using where:存储引擎检索行后再进行过滤。
  • Using temporary:对查询结果排序时会使用一个临时表,尽量避免使用临时表。
  • Using filesort:对结果使用一个外部索引排序,而不是按索引次序从表里读取行,需要进行优化。

总结

由于查询优化器的存在,实际运行查询语句会和想的不一致,因此在进行查询语句优化时,最好运行下EXPLAIN语句,看看是不是和自己想的一致。

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐