可以通过分析sql执行计划:explain
首先创建一个表:
create table test(
id int(10) not null AUTO_INCREMENT,
name varchar(30) not null,
primary key(id)
)engine InnoDB default charset=utf8;
完后我们执行语句: explain select id from test;
可以看到有很多的选项
system > const > eq_ref > ref > rang > index > all
其中system,const只是理想情况,实际能达到的ref>rang
执行语句 explain select id from test;--- id是索引,只需要扫描索引表,不需要扫描全表。
执行语句 explain select name from test;--- name不是索引需要扫描全表。
现在添加一个字段,创建复合索引
alter table test add name1 varchar(30)
alter table test add index name_name1(name,name1)
创建好复合索引后,我们执行:explain select * from test where name = "zhangsan" and name1 = "zhangsan"
在执行:explain select * from test where name1 = "lisi";
explain select name from test
select name from test;
可以看到被优化的数据有四条
using filesort(一般出现在order by语句):性能消耗较大,需要额外一次查询或者排序
using where:需要回表查询(既需要在索引表里查询,又需要在原表查询)
using temporary(一般出现在group by语句):性能消耗较大(用到了临时表)
useing index:性能提升,索引覆盖,不读取原文件,只从索引中读取数据(不需要回表查询)
—— 评论区 ——