MySQL索引(一)

57 阅读5分钟

为什么要学索引

当表中的数据量达到几十万甚至上百万的时候,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:查询时不需要回表查询,直接通过索引就可以获取查询的数据。