索引是一种使记录有序化的技术,它可以指定按某列/某几列预先排序,从而大大提高查询速度(类似于汉语词典中按照拼音或者笔画查找)。
索引的主要作用是加快数据查找速度,提高数据库的性能。
MySQL 索引类型
==============
从物理存储角度上,索引可以分为聚集索引和非聚集索引。
1. 聚集索引(Clustered Index)
聚集索引决定数据在磁盘上的物理排序,一个表只能有一个聚集索引。
索引中键值的逻辑顺序决定了表中相应行的物理顺序(索引中的数据物理存放地址和索引的顺序是一致的),可以这么理解:只要是索引是连续的,那么数据在存储介质上的存储位置也是连续的。
-
如果一个主键被定义了,那么这个主键就是作为聚集索引
-
如果没有主键被定义,那么该表的第一个唯一非空索引被作为聚集索引
-
如果没有主键也没有合适的唯一索引,那么innodb内部会生成一个隐藏的主键作为聚集索引,这个隐藏的主键是一个6个字节的列,改列的值会随着数据的插入自增。
InnoDB引擎会为每张表都加一个聚集索引,而聚集索引指向的的数据又是以物理磁盘顺序来存储的,自增的主键会把数据自动向后插入,避免了插入过程中的聚集索引排序问题。如果对聚集索引进行排序,这会带来磁盘IO性能损耗是非常大的。
2. 非聚集索引(Non-clustered Index)
非聚集索引并不决定数据在磁盘上的物理排序,索引上只包含被建立索引的数据,以及一个行定位符 row-locator,这个行定位符,可以理解为一个聚集索引物理排序的指针,通过这个指针,可以找到行数据。
从逻辑角度,索引可以分为以下几种。
-
普通索引:最基本的索引,它没有任何限制。
-
唯一索引:与普通索引类似,不同的就是索引列的值必须唯一,但允许有空值。如果是组合索引,则列值的组合必须唯一。
-
主键索引:它是一种特殊的唯一索引,用于唯一标识数据表中的某一条记录,不允许有空值,一般用 primary key 来约束