本节要点

索引简介
索引的创建及使用
索引的删除
索引的优缺点

索引简介

对于这样一个查询需求:

(1)、查询2006年6月12日出生的学生有哪些?

SELECT * FROM student WHERE birth_day = '2006-06-12';

假如student表中总共有100多万的学生数据,那么上面这个SQL语句执行的时候,就会从表中的第1条记录开始查起,一起将100多万的数据检索完成后,再返回满足条件的数据。

这样的查询就比较慢。有没有更好的方法呢?

我们可以相像一下,如果我们想快速找到一本书的第10章第2节在哪一页,应该怎么去找呢?

是不是先去翻书本最前面的目录。

对,我们也可以像为书本建目录一样,为表中的数据创建一个目录,这个目录,在SQL语言中,就被称为索引。

通过索引,我们也能快速的找到我们需要的数据。

索引的创建及使用

针对下面这个查询:

SELECT * FROM student WHERE birth_day = '2006-06-12';

我们可以在birth_day字段上创建一个索引,以便提高查询效率:

CREATE INDEX idx_birth_day ON student(birth_day);

这里,idx_birth_day是创建的索引名,student是表名,birth_day是索引字段名。这个索引创建完成后,我们针对birth_day字段的等于、大于、小于的查询可能都会快一些。但对于不等于的查询是无效的。

再比如,查询一年级2班姓名为牛思静的学生信息?

SELECT * FROM student WHERE class_id = 'G0102' AND student_name = '牛思静';

针对这个查询,我们可以创建另一个索引:

CREATE UNIQUE INDEX idx_2 ON student(class_id,student_name);

像这样,多个字段组成的索引,被称为组合索引。

另外要注意,同一张表上的索引名,是不允许重复的。

索引创建完成后,也不需要我们显示的去使用,当我们执行SELECT查询时,数据库会自动会我们匹配最合适的索引。

索引的删除

删除创建完成后,怎么去删除呢?

比如:删除student表上创建的名为idx_2的索引。

DROP INDEX idx_2 ON student;

索引的优缺点

通过上面的讲解,我们知道,创建索引,是为了提高查询表时的速度,包括SELECT、GROUP BY、ORDER BY等操作。而且,当我们创建一个唯一索引时,还可以保证表中数据的唯一性。

但就像书本的目录需要占用书上几页纸张一样,创建索引,也需要占用数据库的物理存储空间。并且当书的内容修改,书的目录也同样需要修改,所以当表中的数据变更时,索引也需要实时的维护,这就需要花费一些时间,并且随着表中数据量的增加,花费的时间也会越来越多。

所以,表上创建的索引,也不是越多越好。我们建议,一张表上的索引,最好不要超过5个。而且组合索引的字段个数,最好也不要超过5个。

picture loss