MySQL对索引的官方定义是:索引是帮助MySQL高效获取数据的数据结构。可以将索引理解成将数据库中指定的数据内容整理成册存放起来,在查询数据时可以通过该册快速查找不需要检索数据库中的每一条数据。
索引的用法
普通索引
创建索引
CREATE INDEX indexName ON table(cloumnName)
修改表
ALTER TABLE table ADD INDEX indexName(cloumnName)
创建表时指定索引
CREATE TABLE table ([...],INDEX indexName(cloumnName...))
删除索引
DROP INDEX [indexName] ON table
唯一索引
与前面的普通索引不同的是,唯一索引的值必须是唯一的,允许有空值
创建索引:
CREATE UNIQUE INDEX indexName ON table(cloumnName)
修改表
ALTER TABLE table ADD UNIQUE indexName(cloumnName)
创建表时指定索引
CREATE TABLE table ([...],UNIQUE indexName(cloumnName...))
主键索引
主键索引是一种唯一性索引,除了要求不允许重复值外,该索引还不能为空,且每个表只能有一个主键。
创建表时指定主键索引
CREATE TABLE table ([...],PRIMARY KEY(cloumnName...))
修改表:
ALTER TABLE table PRIMARY KEY(cloumnName)
索引的优缺点:
优点
- 创建唯一性索引可以保证数据表中每一行数据的唯一性
- 可以提高检索速度
- 可以加速表之间的连接,有利于实现数据的参照完整性
- 在使用分组排序和排序自居进行数据检索时能够节省查询中分组和排序的时间。因为每个索引中的数据都已经在创建索引时按照索引键的键值排好序了。
缺点
- 随着数据量的增加索引占的存储空间也相应增加
- 当对表中的数据进行增删改时,索引也需要动态维护,对索引中相关内容进行相应的增删改。当数据量增大时,数据维护也变得更加耗费时间
分析了索引的优缺点,我们看看适合和不适合创建索引的场景:
一般在以下情况会创建索引:
- 对于需要经常查询的列,可以加快查询速度
- 在作为主键的列,创建索引可以强制该列的唯一性和数据的排列结构
- 在经常用在连接的列上比如:外键。可以加快连接速度
- 在经常需要排序后查询的列,因为索引已经拍好序,创建索引后查询会省掉排序的步骤,加快查询
- 对于经常作为条件判断的列
不适合创建索引的情况:
- 查询中不常用的列
- 只有很少数据值的列,比如:性别。
- 比起检索,修改频次较高的列。之前说过,需要经常修改的列添加索引会带来索引修改的维护负担。