-
建表:
create table user (
id int auto_increment primary key,
name varchar(20) not null,
sex varchar(5) not null,
class int not null,
score int
)engine=innodb; -
插入数据
image.png
-
创建的索引
##添加主键索引
alter table user add primary key (id);
##添加唯一索引
alter table user add unique (name);
##添加组合索引
alter table user add index uk_name_class_score (name,class,score);
- 查看创建的索引
show keys from user;
![](https://img.haomeiwen.com/i10764455/1579ec1f8eff5ded.png)
- 部分SQL语句分析
##1. 未命中任何索引,全表扫描,server层使用where条件过滤(using where)
explain select name, score, sex from user where sex = 'F';
##2. 命中联合索引,覆盖索引,无需回表(using index),server层使用where条件过滤(using where)
explain select name, score from user where name = 'Sandy';
##3. 命中组合索引,非覆盖索引,需要回表,using index where(5.6+新特性),存储引擎使用where条件过滤
explain select name, class, score, sex from user where name = 'Sandy';
##4. 命中索引,索引表全表扫描
explain select name, class, score from user where score > 95;
##5. 未命中索引,全表扫描
explain select name, class, score, sex from user where score > 95;
- 关于group by,order by的优化
一条简单的sql语句,使用了临时表与文件排序
select class, avg(score) from user group by class;
explain select class, avg(score) from user group by class;
优化前:
![](https://img.haomeiwen.com/i10764455/5085ba1c5c576c08.png)
优化方案 : 添加新的索引
alter table user add index uk_class_score (class,score);
或者
alter table user add index uk_class (class);
优化后:
![](https://img.haomeiwen.com/i10764455/a12469cf2093f864.png)
网友评论