平常工做中,使用MySQL
的机会仍是蛮多的,主要考虑Schema与数据类型优化、如何建立索引、根据业务场景的查询优化。这些想必你们都在高性能MySQL
这本书中看过,可能也比做者理解的深,本文旨在对EXPLAIN
语句使用、分析进行整理。html
EXPLAIN
语句是什么?官网对于EXPLAIN
的做用定义以下:mysql
The EXPLAIN statement provides information about how MySQL executes statements. EXPLAIN works with SELECT, DELETE, INSERT, REPLACE, and UPDATE statements.sql
简单来说,EXPLAIN
语句告诉咱们MySQL如何执行SQL语句,而咱们经过这些信息,能够达到优化SQL语句执行效率的目的。数据库
接下来,就要对EXPLAIN
返回的格式进行了解了,具体以下:ide
字段名 | 字段描述 |
---|---|
id | 查询语句内SELECT的序列号 |
select_type | SELECT类型 |
table | 访问的表名 |
partitions | 命中分区 |
type | 数据访问类型,下文详细介绍 |
possible_keys | 有关索引,实际状况可能不可用 |
key | MySQL查询优化器实际使用的索引 |
key_len | 索引存储长度 |
ref | 实际使用的索引中,用于比较的常量或列 |
rows | 查询须要读取的行数,innodb引擎是一个衡量效率的指标,有时可能不许确 |
Extra | 查询执行的附加信息,下文详细介绍 |
在分析SQL语句执行时,主要用到的列,分别为type
、Extra
,下文的测试用例均为官网提供的sakila
数据库,附上下载连接。性能
本文使用MySQL 8.0.十二、Navicat 12.1测试
explain select * from actor where actor_id = 1
复制代码
explain select * from actor, film_actor where actor.actor_id = film_actor.actor_id and actor.actor_id = 1
复制代码
explain select * from film where title= 'ACE GOLDFINGER'
复制代码
BETWEEN
、>
、>
范围内的。explain select * from film where film_id BETWEEN 1 AND 100
复制代码
Extra列中看到“Using index”,说明是覆盖索引,只须要读取索引列,不须要读取行数据。 使用索引次序全表读取。优化
explain select actor.actor_id from film_actor, actor where film_actor.actor_id = actor.actor_id
复制代码
explain select * from film_actor, actor where film_actor.actor_id = actor.actor_id
复制代码
因为查询优化器的存在,实际运行查询语句会和想的不一致,所以在进行查询语句优化时,最好运行下EXPLAIN
语句,看看是否是和本身想的一致。spa