13.2.6 索引

13.2.6 索引

索引是存放在模式(schema)中的一个数据库对象,虽然索引总是从属于数据表,但它也和数据表一样属于数据库对象。创建索引的唯一作用就是加速对表的查询,索引通过使用快速路径访问方法来快速定位数据,从而减少了磁盘的I/O。
索引作为数据库对象,在数据字典中独立存放,但不能独立存在,必须属于某个表

提示

MySQL使用information_schema数据库里的STATISTICS表来保存该数据库实例中的所有索引信息,用户可通过查询该表来获取该数据库的索引信息。

创建索引

创建索引有两种方式。
自动:当在表上定义主键约束、唯一约束和外键约束时,系统会为该数据列自动创建对应的索引。
手动:用户可以通过create index...语句来创建索引。

删除索引

删除索引也有两种方式。
自动:数据表被删除时,该表上的索引自动被删除。
手动:用户可以通过drop index...语句来删除指定数据表上的指定索引。

一个表中可以有多个索引列,每个索引都可用于加速该列的查询速度

手动创建索引

通常为经常需要查询的数据列建立索引,可以在一列或者多列上创建索引。创建索引的语法格式如下:

1
2
create index 索引名称
on 表名 (column[,coulumn]...);

单列索引

下面的索引将会提高对employees表基于last_name字段的查询速度。

1
2
create index emp_last_name_idx
on employees(last_name);

多列索引

也可同时对多列建立索引,如下SQL语句所示:

1
2
create index emp_last_name_idx2
on employees(first_name,last_name);

删除索引

MySQL中删除索引需要指定表,采用如下语法格式:

1
drop index 索引名 on 表名

如下SQL语句删除了employees表上的emp_last_name_idx2索引:

1
2
drop index emp_last_name_idx2
on employees

有些数据库删除索引时无须指定表名,因为它们要求建立索引时每个索引都有唯一的名字,所以无须指定表名,例如Oracle就采用这种策略。但MySQL只要求同一个表内的索引不能同名,所以删除索引时必须指定表名。

索引优缺点

索引的好处是可以加速查询,但索引也有如下两个坏处。

  • 当数据表中的记录被添加、删除、修改时,数据库系统需要维护索引,因此有一定的系统开销。
  • 存储索引信息需要一定的磁盘空间。