什么是索引

索引(Index)是帮助MySQL高效获取数据的数据结构。索引在数据量较小时用处不大;但当数据库数据量非常大(百万级以上)时,索引可以极大地提升数据的查询速度。InnoDB引擎索引底层实现默认的数据结构是BTree。

如何创建索引

方法一:在创建表时,使用SQL语句给某一字段创建某种类型的索引。(详见:索引的分类)

方法二:在表创建完成后,使用SQL语句给某一字段添加索引或修改某一字段的索引。

1
CREATE 索引类型 INDEX `索引名称` ON `表名`(`字段名`);  -- 给某个表的某个字段添加某种类型的索引
1
ALTER TABLE `数据库名称`.`表名` ADD 索引类型 INDEX `索引名称` (`字段名`); -- 修改某个表的某个字段的索引

方法三:在创建表时或在表创建完成后,使用可视化工具给某一字段添加某种类型的索引。

索引的分类

  1. 主键索引(PRIMARY KEY)

创建命令格式:

1
PRIMARY KEY(`字段名称`)

注意:

  • 主键是区分表中每行数据的唯一标识。
  • 一个表只能有一列作为主键。
  • 一个表中各行的主键值是唯一的。
  1. 唯一索引(UNIQUE KEY)

创建命令格式:

1
UNIQUE KEY `索引名称`(`字段名称`)

注意:

  • 唯一索引的列不允许行值重复,允许为NULL。
  • 一个表允许多个列(字段)创建唯一索引。
  • 若将某一字段设置为唯一索引,则该索引的Non_unique属性为1,否则为0。

应用举例:一个人的身份证号码是唯一的。

  1. 常规索引(KEY/INDEX)

创建命令格式:

1
KEY `索引名称`(`字段名称`)

注意:

  • 常规索引可以使用关键字KEY或INDEX标识。
  • 常规索引没有什么限制,允许插入NULL和重复值。
  1. 全文索引(FULLTEXT)

创建命令格式:

1
FULLTEXT `索引名称`(`字段名称`)

注意:

  • 最新版的InnoDB和MyISAM引擎都支持全文索引功能。
  • 只能在CHAR、VARCHAR、TEXT类型的字段上加全文索引。
  • 主要用来查找文本中的关键字,而不是直接与字段值进行比较。

全文索引需要配合函数match(字段名)和函数against(‘搜索文本’)进行全文搜索。命令格式:

1
select 字段名1,[字段名2,……] from 表名 where match(字段名) against('搜索文本');

另外:

  • 显示一个表的全部索引信息:
1
SHOW INDEX FROM `表名`; -- 显示一个表的全部索引信息
  • 分析SQL语句执行的状况:
1
2
EXPLAIN SELECT 字段名1,[字段名2,……] FROM 表名; -- 分析非全文索引SQL语句执行的状况
EXPLAIN SELECT 字段名1,[字段名2,……] FROM 表名 WHERE MATCH(字段名) AGAINST('搜索文本'); -- 分析全文索引SQL语句执行的状况

创建索引的原则

  • 索引不是越多越好。
  • 不要对经常变动的数据加索引。
  • 数据量较小的表不需要加索引。
  • 索引一般加在常用来查询的字段上。