explain详解
mysql为我们提供了很有用的辅助武器explain,它向我们展示了mysql接收到一条sql语句的执行计划。根据explain返回的结果我们便可以知道我们的sql写的怎么样,是否会造成查询瓶颈,同时根据结果不断的修改调整查询语句,从而完成sql优化的过程
- id SELECT识别符。这是SELECT查询序列号。这个不重要,查询序号即为sql语句执行的顺序
- select_type
- type 连接类型
- possible_keys 提示使用哪个索引会在该表中找到行,不太重要
- keys MYSQL使用的索引,简单且重要
- key_len MYSQL使用的索引长度
- ref ref列显示使用哪个列或常数与key一起从表中选择行。
- rows 显示MYSQL执行查询的行数,简单且重要,数值越大越不好,说明没有用好索引
- Extra 该列包含MySQL解决查询的详细信息。
type
CREATE TABLE `student` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`no` varchar(10) NOT NULL,
`name` varchar(20) NOT NULL,
`position` varchar(20) NOT NULL,
`age` int(10) NOT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `i_name` (`name`) USING BTREE,
KEY `i_age` (`age`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=11 DEFAULT CHARSET=utf8;
1. ALL 全表扫描
2.index 只会扫描索引
3.range range指的是有范围的索引扫描,相对于index的全索引扫描,它有范围限制,因此要优于index
4.ref 出现该连接类型的条件是: 查找条件列使用了索引而且不为主键和unique
5.eq_ref 连表查询会出现 连表查询原理
6.const 满足条件的记录只用一条, 通常出现在主键和唯一索引中
连表查询
using temporary 官方解释:”为了解决查询,MySQL需要创建一个临时表来容纳结果。典型情况如查询包含可以按不同情况列出列的GROUP BY和ORDER BY子句时。“”很明显就是通过where条件一次性检索出来的结果集太大了,内存放不下了,只能通过家里临时表来辅助处理
using filesort 官方解释:“MySQL需要额外的一次传递,以找出如何按排序顺序检索行。通过根据联接类型浏览所有行并为所有匹配WHERE子句的行保存排序关键字和行的指针来完成排序。然后关键字被排序,并按排序顺序检索行”