explain工具优化mysql需要达到什么级别?
- 一、explain工具是什么?
- 二、explain查询后各字段的含义
- 三、explain查询后type字段有哪些类型?
- 四、type类型需要优化到哪个阶段?
一、explain工具是什么?
explain是什么?使用EXPLAIN关键字可以模拟优化器执行SQL查询语句,从而知道MySQL是如何处理你的SQL语句的。分析你的查询语句或是表结构的性能瓶颈。
explain的使用方法非常的简单,explain+sql就可以了。下面我们来简单的执行一条
mysql> explain select * from student where id=1000;
+----+-------------+---------+------------+-------+---------------+---------+---------+-------+------+----------+-------+
| id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra |
+----+-------------+---------+------------+-------+---------------+---------+---------+-------+------+----------+-------+
| 1 | SIMPLE | student | NULL | const | PRIMARY | PRIMARY | 4 | const | 1 | 100.00 | NULL |
+----+-------------+---------+------------+-------+---------------+---------+---------+-------+------+----------+-------+
1 row in set, 1 warning (0.04 sec)
二、explain查询后各字段的含义
- id:在一个大的查询语句中每个SELECT关键字都对应一个 唯一的id
- select_type:SELECT关键字对应的那个查询的类型
- table :表名
- partitions :匹配的分区信息
- type :针对单表的访问方法
- possible_keys: 可能用到的索引
- key :实际上使用的索引
- key_len: 实际使用到的索引长度
- ref :当使用索引列等值查询时,与索引列进行等值匹配的对象信息
- rows: 预估的需要读取的记录条数
- filtered:某个表经过搜索条件过滤后剩余记录条数的百分比
- Extra: 一些额外的信息
三、explain查询后type字段有哪些类型?
- all :表中没有任何索引,每次查询需要全表扫描
- index :表中有主键索引,扫描全表索引,每次查询需要全表扫描索引文件,通常比all快一些,但也很慢,需优化。
- range :范围查询,例如select * from student where id >10; < > between
- const:通过索引一次就可以找到,例如:select * from student where id =10;
- ref:指的是这个非唯一键索引扫描,例如我们给student表的name字段加个普通索引,有
select * from student where name = '张三';
- eq_ref:这个主要用于多表查询。其含义主要是唯一索引扫描对于每个索引列表中只有一条记录与之匹配。常用于主键或者唯一索引扫描,这可能是const之外最好的链接类型了,简单的select查询不会出现这种type。
这个第二个出现这个eq_ref,其实这个也比较好理解。eq_ref - 想象你有两张桌子。表A包含列(id,text),其中id是主键。表B具有相同的列(id,text),其中id是主键。表A包含以下数据:
1, Hello
2, How are
表B有以下数据:
1, world!
2, you?
想象一下eq_ref为A和B之间的JOIN:
select A.text, B.text where A.ID = B.ID
这个JOIN非常快,因为对于表A中扫描的每一行,表B中只能有一行满足JOIN条件。一个,不超过一个。那是因为B.id是独一无二的。
四、type类型需要优化到哪个阶段?
至少是需要优化到range级别的,这里我们可以参考阿里巴巴开发手册的推荐:
如果我们的type是all或者index级别均是需要优化的。