1.索引分类
根据索引的用途在逻辑上可以分为以下五种

1)普通索引normal
普通索引是最基本的索引类型,唯一任务是加快对数据的访问速度,没有任何限制。创建普通索引时,通常使用的关键字是 INDEX 或 KEY

2)唯一性索引unique
唯一性索引是不允许索引列具有相同索引值的索引。如果能确定某个数据列只包含彼此各不相同的值,在为这个数据列创建索引的时候就应该用关键字 UNIQUE 把它定义为一个唯一性索引。创建唯一性索引的目的往往不是为了提高访问速度,而是为了避免数据出现重复

3)主键索引PRIMARY
主键索引是一种唯一性索引,即不允许值重复或者值为空,并且每个表只能有一个主键。主键可以在创建表的时候指定,也可以通过修改表的方式添加,必须指定关键字 PRIMARY KEY,注意一张表只能有一个主键

4)空间索引
空间索引主要用于地理空间数据类型 GEOMETRY

5)全文索引full textl
全文索引只能在 VARCHAR 或 TEXT 类型的列上创建,并且只能在 MyISAM 存储引擎

在实际使用中,索引通常被创建成单列索引和组合索引
单列索引就是索引只包含原表的一个列
组合索引也称为复合索引或多列索引,相对于单列索引来说,组合索引是将原表的多个列共同组成一个索引
敲黑板:一个表可以有多个单列索引,但这些索引不是组合索引。一个组合索引实质上为表的查询提供了多个索引,以此来加快查询速度。比如,在一个表中创建了一个组合索引(c1,c2,c3),在实际查询中,系统用来实际加速的索引有三个:单个索引(c1)、双列索引(c1,c2)和多列索引(c1,c2,c3)

2.索引注意事项和使用原则
注意事项
创建索引虽然可以提升Mysql的查询性能,但是索引在使用的时候也不是为所欲为,越多越好,
需要注意以下几点:
索引的创建和维护需要消耗时间,这个时间会随着数据量的增多而增加,除了表中数据占用控件,索引也需要占用一定空间,如果要建立聚簇索引,那么需要的空间就会更大,当对表中的数据进行增加、删除和修改的时候,索引也要动态地维护,这样就降低了数据的维护速度;
1)使用原则
(1)在经常需要搜索的列上建立索引,可以加快搜索的速度;
(2)在作为主键的列上创建索引,强制该列的唯一性,并组织表中数据的排列结构,在InnoDB存储引擎,默认给主键添加索引;
(3)在经常使用表连接的列上创建索引,这些列主要是一些外键,可以加快表连接的速度;
(4)在经常需要根据范围进行搜索的列上创建索引,因为索引已经排序,所以其指定的范围是连续的;
(5)在经常需要排序的列上创建索引,因为索引已经排序,所以查询时可以利用索引的排序,加快排序查询;
(6)在经常出现在WHERE子句中的列上添加索引,加快条件的判断速度。

2)以下场景建议不要添加索引,添加了反而增加数据库的压力,产生负面影响
(1)对于那些在查询中很少使用或参考的列不应该创建索引。因为这些列很少使用到,所以有索引或者无索引并不能提高查询速度。相反,由于增加了索引,反而系统要去维护和存储,增大压力;
(2)对于那些只有很少数据值的列也不应该创建索引。因为这些列的取值很少,例如用户表的爱好列。查询结果集的数据行占了表中数据行的很大比例,增加索引并不能明显加快检索速度;
(3)对于那些定义为 TEXT、IMAGE 和 BIT 数据类型的列不应该创建索引。因为这些列的数据量要么相当大,要么取值很少;
(4)当修改性能远远大于检索性能时,不应该创建索引。因为修改性能和检索性能是互相矛盾的。当创建索引时,会提高检索性能,降低修改性能。当减少索引时,会提高修改性能,降低检索性能。因此,当修改性能远远大于检索性能时,不应该创建索引,就是表中某个字段经常修改不要添加索引,因为会动态维护!