目录
可以查看查询语句的执行计划,是查询性能优化的重要工具。
explain select * from staffs where name='z3'and age=22 and pos='manager';

id代表SQL语句的执行顺序。
id越大,优先级越高,越先被执行。
id相同,执行顺序由上至下。
id列为null:表示这是一个结果集,不需要使用它来进行查询。
可用于判断查询是否高效,由优到劣。
system>const >eq_ref >ref >index_merge> range> index >ALL
system:表只有一行记录,const类型的特例
const: 针对主键或唯一索引的等值查询扫描,表示通过索引一次就找到了,最多只返回一行数据
eq_ref :表示联表查询时,按联表的主键或唯一键联合查询
ref: 此类型通常出现在多表的 join 查询,针对于非唯一或非主键索引
range: 表示使用索引范围查询
index: 表示全索引扫描(full index scan),和 ALL 类型类似,只不过 ALL 类型是全表扫描,而 index 类型则仅仅扫描所有的索引, 而不扫描数据
ALL: 表示全表扫描
mysql 在查询时,可能使用到的索引。
查询实际使用的哪个索引
索引使用的字节数。
显示索引的哪一列被使用。
执行查询读取的行数,数值越大表示查询效率越差。(估算值)
查询的表行占表的百分比
额外的信息,不适合在其它列显示但十分重要的信息
Using filesort:表示MySQL会对数据使用一个外部的索引排序,而不是按照表内的索引顺序进行读取,MySQL中无法利用索引完成的排序操作称为“文件排序”。
Using temporary:表示使用了临时表存储中间结果,常见于order by和group by子句。
Using index:表示select子句中使用了覆盖索引。
Using where:表示使用了where条件。
Using join buffer:表示使用了连接缓存。
impossible where:表示where子句的值总是false。
distinct:表示发现第一个匹配行后不再继续搜索。
可以在数据库中玩一下

示例sql --包括建表语句
- CREATE TABLE staffs(
- id INT PRIMARY KEY AUTO_INCREMENT,
- `name` VARCHAR(24) NOT NULL DEFAULT'' COMMENT'姓名',
- `age` INT NOT NULL DEFAULT 0 COMMENT'年龄',
- `pos` VARCHAR(20) NOT NULL DEFAULT'' COMMENT'职位',
- `add_time` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT'入职时间'
- )CHARSET utf8 COMMENT'员工记录表';
- #新增数据
- INSERT INTO staffs(`name`,`age`,`pos`,`add_time`) VALUES('z3',22,'manager',NOW());
- INSERT INTO staffs(`name`,`age`,`pos`,`add_time`) VALUES('July',23,'dev',NOW());
- INSERT INTO staffs(`name`,`age`,`pos`,`add_time`) VALUES('2000',23,'dev',NOW());
- #联合索引
- ALTER TABLE staffs ADD INDEX index_staffs_nameAgePos(name,age,pos);
-
- CREATE TABLE staffs1(
- id INT PRIMARY KEY AUTO_INCREMENT,
- `name` VARCHAR(24) NOT NULL DEFAULT'' COMMENT'姓名',
- `age` INT NOT NULL DEFAULT 0 COMMENT'年龄',
- `pos` VARCHAR(20) NOT NULL DEFAULT'' COMMENT'职位',
- `add_time` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT'入职时间'
- )CHARSET utf8 COMMENT'员工记录表1';
- #新增数据
- INSERT INTO staffs1(`name`,`age`,`pos`,`add_time`) VALUES('z3',22,'manager',NOW());
- INSERT INTO staffs1(`name`,`age`,`pos`,`add_time`) VALUES('July',23,'dev',NOW());
- INSERT INTO staffs1(`name`,`age`,`pos`,`add_time`) VALUES('2000',23,'dev',NOW());
- INSERT INTO staffs1(`name`,`age`,`pos`,`add_time`) VALUES('hua',24,'ddd',NOW());
- #联合索引
- ALTER TABLE staffs1 ADD INDEX index_staffs_nameAgePos(name,age,pos);
-
- #分析
- explain select * from staffs where id = '1';
- explain select * from staffs where 1 = 1 group by age;
- explain select * from staffs where name='z3'and age=22 and pos='manager';
- explain select staffs.name from staffs left join staffs1 on staffs.id = staffs1.id ;
- explain select * from staffs where name = (select name from staffs where age =22);
- explain select * from staffs where name = 'July' union select * from staffs1 where age =24 ;
参考博文: