MySQL索引概述
当表中的数据量到达几十万甚至上百万的时候,SQL查询所花费的时间会很长,导致业务超时出错,此时就需要用索引来加速SQL查询。
由于索引也是需要存储成索引文件的,因此对索引的使用也会涉及磁盘I/O操作。如果索引创建过多,使用不当,会造成SQL查询时,进行大量无用的磁盘I/O操作,降低了SQL的查询效率,适得其反,因此掌握良好的索引创建原则非常重要!
索引分类
索引的出现其实就是为了提⾼数据查询的效率,索引是创建在表上的,是对数据库表中一列或者多列的值进行排序的一种结果。
索引的优点:提高查询效率
索引的缺点:索引并非越多越好,过多的索引会导致CPU使用率 居高不下,由于数据的改变,会造成索引文件的改动,过多的磁盘I/O造成CPU负载太重
索引分类
-
普通索引:没有任何限制条件,可以给任何类型的字段创建普通索引(创建新表&已创建表,数量是不限的,一张表的一次SQL查询只能用一个索引)
-
唯一性索引:使用UNIQUE修饰的字段,值不能够重复,主键索引就隶属于唯一性索引
-
主键索引:使用PRIMARY KEY修饰的字段会自动创建索引(MyISAM,InnoDB)
-
单列索引:在一个字段上创建索引
-
多列索引:在表中的多个字段上创建索引(uid+cid)。注:多列索引必须使用到第一列,才能用到多列索引,否则索引用不上。
-
全文索引:使用FULLTEXT参数可以设置全文索引,只支持CHAR,VARCHAR和TEXT类型的字段上,常用于数据量较大的字符串类型上,可以提高查询速度。(线上项目支持专门的搜索功能,给后台服务器增加专门的搜索引擎支持快速高效的搜索 elasticsearch 简称es C++开源的搜索引擎 搜狗的workflow)
索引创建和删除
创建表的时候指定索引字段
create table index1(
id INT,
name VARCHAR(20),
sex ENUM('male','female'),
INDEX(id,name));
在已经创建的表上添加索引
create [unique] index 索引名 on 表名(属性名(length)[ASC | DESC]);
create index nameidx on student(name);
也可以有多个列名构成索引(即,多列索引)
删除索引:
drop index 索引名 on 表名;
查看索引
show create table student\G;
注意!!!
- 经常作为where条件过滤的字段考虑添加索引
- 字符串列创建索引时,尽量规定索引的长度,而不能让索引值的长度key_len过长
- 当SQL中索引字段涉及数据类型强转或MySQL函数调用,表达式计算等,索引就用不上了
索引的执行过程
explain查看执行过程
使用explain查看sql的执行计划,分析索引的执行过程。