# 索引

# 1. 索引的概念、优点及缺点

  • 索引是创建在表上的,是对数据库表中 一列或多列 的值进行 排序 的一种结构。
  • 索引可以提高查询速度。
  • 通过索引,查询数据时不必读完记录的所有信息,而只是查询索引列。

索引的缺点:

  • 创建和维护索引需要消耗时间,简单来说,就是牺牲增删改的时间,换查询时间。
  • 索引需要占物理空间。

# 2. 索引的分类

存储类型 上分,有两种索引类型:

  • BTree 索引
  • Hash 索引

InnoDB 和 MyISAM 引擎都支持的 BTree 索引。

除了类型分类法,索引还有另外的分类方式,被分为:

  • 普通索引。普通索引没有任何附加条件,可以创建在任何数据类型中。
  • 唯一索引。唯一索引必须建在使用了 UNIQUE 修饰的列上。
  • 全文索引。全文索引必须建在使用了 FULLTEXT 修饰的列上,而且该列的数据类型必须是 CAHR、VARCHAR 或 TEXT 类型。另外,MyISAM 支持全文索引,但 InnoDB 不支持。
  • 空间索引。这种索引只能建立在空间数据类型的列上,且仅 MyISAM 引擎支持。极为罕见。

索引可以建立在某个列上,这样的索引无论是上述何种类型,都称为单列索引。相对应的,如果是在表的多个列上创建一个索引,这种索引被称为多列索引,但是只有查询条件中使用了这些列的第一个时,索引才会被使用。

# 3. 索引的设计原则:

  • 如果有唯一性的列,必建唯一索引。
  • 为常作为查询条件的字段建立索引。
  • 为经常需要排序,分组和联合操作的字段建立索引。
  • 限制索引数量。
  • 即使删除不再使用,或很少使用的索引。
  • 数据量小的表没有必要建立索引。

# 4. 索引的创建

在建表时,对某列使用过 主键外键唯一 约束,MySQL 会默认在这些列上创建索引。

创建索引语句,在表声明的尾部。所用关键字可以是 INDEX,也可以是 KEY 。

  • 普通索引

    INDEX [索引名](列名)
    
  • 唯一索引:

    UNIQUE INDEX [索引名](列名)
    
  • 全文索引:

    FULLTEXT INDEX [索引名](列名)
    
  • 以上创建的都是单列索引,如果要创建多列索引则:

    INDEX [索引名](列名1, 列名2, ...)
    

如果在建表语句之外,通过『修改』命令可以添加/删除索引。

ALTER TABLE <表名> ADD INDEX [索引名](列名, [列名, ...]);
ALTER TABLE <表名> DROP INDEX <索引名>;

CREATE INDEX 索引名 ON();
DROP INDEX 索引名 ON;