基本概念
索引是一种特殊的数据库结构,可以用来快速查询数据库表中的特定记录,是提高数据库性能的重要方式。MySQL 中,所有的数据类型都可以被索引。
通过索引,查询数据时可以不必读完记录的所有信息,而只是查询索引列,否则数据库系统将读取每条记录的所有信息进行匹配。
例如:索引相当于新华字典的音序表,如果要查“过”字,如果不适用音序,就需要从字典的第一页开始翻几百页;如果提取拼音出来,构成音序表,就只需要从 10 多页的音序表中直接查找,这样就可以大大节省时间。因此,使用索引可以在很大程度上提高数据库的查询速度,有效地提高了数据库系统的性能。
优缺点
- 
优点:可以提高检索数据的速度。
 
- 
缺点:
 
- 创建和维护索引需要耗费时间,耗费时间量随着数据量的增加而增加;
 
- 索引需要占用物理空间,每一个索引要占一定的物理空间;
 
- 增加、删除和修改数据时,要动态地维护索引,造成数据的维护速度降低了。
 
存储结构
数据库底层索引实现主要有两种存储类型,B 树(BTREE)和哈希(HASH)索引,InnoDB 和 MyISAM 使用 BTREE 索引;而 MEMORY 存储引擎可以使用 BTREE 和 HASH 索引,默认用 BTREE。在没有指定的情况下,数据库使用的引擎是 InnoDB。
普通索引
创建表时定义索引
1 2 3 4 5 6 7 8 9
   | CREATE TABLE tablename(     propname1 type1,     propname2 type2,     ....     propnamen typen,       # 以上为属性声明     INDEX | KEY     [indexname] (propnamen [(length)] [ ASC | DESC ] )  );
   | 
 
- INDEX 和 KEY:用来指定字段为索引的,两者选择其中之一就可以了,作用是一样的;
 
- indexname:索引名字,可省略;
 
- propnamen:索引对应的字段的名称,该字段必须为前面定义好的字段;
 
- length:可选参数,其指索引的长度,必须是字符串类型才可以使用(如果长度太短,可表示的信息就越少,对于超大量数据就没法全部表示,一般会由 MySQL 自己根据数据量确定长度);
 
- ASC 和 DESC:可选参数,ASC 表示升序排列,DESC 表示降序排列,如果不指定,则为升序。
 
已存在的表上创建索引
1 2 3 4 5 6
   | CREATE INDEX indexname   ON tablename (propname [(length)] [ASC|DESC]);  
 
  ALTER TABLE tablename ADD INDEX | KEY indexname   (propname [(length)] [ASC|DESC]);  
   | 
 
使用案例
1 2 3 4 5 6
   | create table class(     id int,     name varchar(128) unique,     teaccher varchar(64) ,     index index_no (id desc) );
   | 
 
1 2 3
   | create index index_id on class(id asc);
  alter table class add index index_id (id asc);
   | 
 
唯一索引
创建表时定义索引
1 2 3 4 5 6 7
   | CREATE TABLE tablename(     propname1 type1,     ...     propnamen typen,     UNIQUE INDEX | KEY      [indexname] (propnamen [(length)] [ ASC | DESC ] )  );
   | 
 
已存在的表上创建索引
1 2 3 4 5
   | CREATE UNIQUE INDEX indexname   ON tablename (propname [(length)] [ASC|DESC]);  
  ALTER TABLE tablename ADD UNIQUE INDEX | KEY  indexname (propname [(length)] [ASC|DESC]);  
   | 
 
使用案例
1 2 3 4 5 6
   | create table class (     id int ,     name varchar(128),     teacher varchar(64),     unique index name_index(name) );
   | 
 
1 2 3 4 5 6 7 8
   | create table class(     id int,     name varchar(128) unique,     teacher varchar(64),     unique index name_index (name) );
  ## 当我们给某给字段定义了唯一约束时,MySQL为了保证唯一性,便会自动给这个字段添加唯一索引,而之后再手动给这个字段添加唯一索引便是一些多余操作
   | 
 
1 2 3
   | create unique index name_index on class(name);
  alter table class add unique index name_index (name);
   | 
 
全文索引
创建表时定义索引
1 2 3 4 5 6 7 8
   | CREATE TABLE tablename(     propname1 type1,     propname2 type2,     ...     propnamen typen,     FULLTEXT INDEX | KEY     [indexname] (propnamen [(length)] )  );
   | 
 
已存在的表上创建索引
1 2 3 4 5
   | CREATE FULLTEXT INDEX indexname ON tablename(propname [(length)]); 
  ALTER TABLE tablename ADD FULLTEXT INDEX|KEY indexname(propname [(length)]);
   | 
 
使用案例
1 2 3 4 5 6 7
   | create table class(     id int,     name varchar(128) unique,     teacher varchar(64),     comment varchar(1024),     fulltext index index_comm(comment) );
   | 
 
1 2 3
   | create fulltext index index_comment on class(comment);
  alter table class add fulltext index index_comm(comment);
   | 
 
多列索引
创建表时定义索引
1 2 3 4 5 6 7 8 9
   | CREATE TABLE tablename(     propname1 type1,     ...     propnamen typen,     INDEX | KEY [indexname] (propname1 [(length)] [ ASC | DESC ],                              propname2 [(length)] [ ASC | DESC ],                                ... ...                                                             propnamen [(length)] [ ASC | DESC ])  );
   | 
 
已存在的表上创建索引
1 2 3 4 5 6 7 8 9 10 11 12 13
   | CREATE INDEX indexname ON tablename( propname1 [(length)] [ ASC | DESC ],                 propname2 [(length)] [ ASC | DESC ],                  ...                                         propnamen [(length)] [ ASC | DESC ]);                
 
  ALTER TABLE tablename ADD INDEX|KEY indexname(propname1 [(length)] [ ASC | DESC ],                 			propname2 [(length)] [ ASC | DESC ],                                       ...                                                             	propnamen [(length)] [ ASC | DESC ]); 
   | 
 
使用案例
1 2 3 4 5 6
   | create table class(     id int,     name varchar(128) unique,     teacher varchar(64),     index index_mult_columns(id asc, teacher) );
   | 
 
1 2 3
   | create index index_mult_columns on class(id,teacher);
  alter table class add index index_mult_columns(id,teacher);
   |