为什么要学索引
当表中的数据量达到几十万甚至上百万的时候,sql查询花费的时间会很长,导致业务超时出错,此时就需要用索引来加速sql查询。
由于索引也是需要存储成索引文件的,因此对索引的使用也会设计磁盘I/O操作。如果索引创建过多,使用不当,会造成sql查询时,进行大量无用的磁盘I/O操作,降低了sql的查询效率,适得其反,因此掌握良好的索引创建原则非常重要。
索引分类
索引是创建在表上的,是对数据库表中一列或者多列的值进行排序的一种结果。索引的核心是提高查询速度。
索引的优点:提高查询效率
索引的缺点:索引并非越多越好,过多的索引会导致CPU使用率居高不下,由于数据的改变,会造成索引文件的改动,过多的磁盘I/O造成CPU负荷太重。
物理上 -> 聚集索引 & 非聚集索引
逻辑上 ->
1.普通索引(二级索引):没有任何限制条件,可以给任何类型的字段创建普通索引
(创建新表&已创建表,数量不限,一张表的一次sql查询只能用一个索引)
2.唯一性索引:使用UNIQUE修饰的字段,值不能够重复,主键索引就隶属于唯一性索引
2.主键索引:使用Primary Key修饰的字段会自动创建索引
4.单列索引:在一个字段上创建索引
5.多列索引:在表的多个字段上创建索引
(多列索引必须使用第一个列才能使用多列索引,否则索引用不上)
6.全文索引:使用FULLTEXT参数可以设置全文索引,只支持CHAR ,VARCHAR ,和TEXT类型的字段上,常用于数量较大的字符串上,可以提高查询速度
(线上项目支持专门的搜索功能,给后台服务器增加专门的搜索引擎支持快速高效的搜索,elasticsearch 简称es或workflow)
索引的创建和删除
创建表的时候指定索引字段
CREATE TABLE student(id INT,
name VARCHAR(20),
sex ENUM('male','female'),
INDEX(id);
在已创建的表上添加索引
CREATE [UNIQUE] INDEX 索引名 ON 表名(属性名(length) [ASC | DESC]);
# create index nameidx on student(name);
删除索引
DROP INDEX 索引名 ON 表名
注:
1.经常作为where条件过滤的字段考虑添加索引。
2.字符串列创建索引时,尽量规定索引的长度,而不能让索引值的长度key_len过长。
3.索引字段设计类型强转,mysql函数调用、表达式计算等,索引就用不上了。
索引的执行过程
用explain来查看sql的执行计划,分析索引的执行过程,这里我们以user表为例:
我们先来看user表中的数据:
使用以下命令来查看建表过程:
show create table user\G
可以看到,user表中id为主键,并且表中只有一个primary索引。
使用expian来查看使用主键索引的执行过程:其中type的值为const,key值为primary。
对sex字段创建索引后使用sex字段对应的索引查询,执行过程:其中type的值为ref,key值为sexidx。
explain结果字段的取值
id
SELECT查询的序列号,表示查询中执行SELECT子句或操作表的顺序。id数字越大,优先级越高,越先执行。
select_type
simple:最简单的查询,不包含子查询或者union
primary:一个需要union操作或者含有子查询的select,位于最外层的单位查询的select_type即为primary且只有一个。
union:union连接的两个select查询,除了第一个表以外,第二个以后的表的select_type都是union。
union result:包含union的结果集,在union和union all语句中,因为它不需要参与查询,所以id字段为null。
table
显示查询的表名。如果不涉及对数据库操作,这里显示null,如果显示为尖括号就表示这是个临时表,后面的N就是执行计划中的id,表示结果来自于这个查询产生的,如果是尖括号起来<union M,N>这也是一个临时表,表示结果来自于union查询的id为M,N的结果集。
type
const:使用唯一索引或主键索引,用于比较primary key 或 union key 的所有列与常量值的情况(WHERE id = 1)。
ref:常见于辅助索引的等值查找,或者多列主键,唯一索引中,使用第一列之外的列作为等值查找,或者返回数据不唯一的等值查找。
range:索引范围扫描,常见于使用<、>、is null、between、in、like等运算符的查询中。
index:索引全表扫描,把索引从头扫一遍。常见于使用索引列就可以处理,不需要读取的数据文件的查询。
all:全表扫描。
ref
如果使用常数等值查询,这里显示const;
如果是连接查询,被驱动表的执行计划这里会显示驱动表的关联字段;
Extra
using filesort:排序时无法用到索引,常见于order by 和 group by语句中。
using index:查询时不需要回表查询,直接通过索引就可以获取查询的数据。