索引(Index)是帮助数据库高效获取数据的数据结构。索引是在基于数据库表创建的,它包含一个表中某些列的值以及记录对应的地址,并且把这些值存储在一个数据结构中。最常见的就是使用哈希表、B+树作为索引。
什么是聚集索引和非聚集索引?
Mysql 底层是用 B+ 树来存储索引的,且数据都存在叶子节点。对于 InnoDB 来说,它的主键索引和行记录是存储在一起的,因此叫做聚集索引(clustered index)。
MyISAM 的行记录是单独存储的,不和索引在一起,因此 MyISAM也就没有聚集索引。
除了聚集索引,其它索引都叫做非聚集索引(secondary index)。包括普通索引,唯一索引等。
唯一索引:如果确定某个数据列只包含彼此各不相同的值,在为这个数据列创建索引的时候,就应该用关键字UNIQUE把它定义为一个唯一索引,Mysql会在有新纪录插入数据表时,自动检查新纪录的这个字段的值是否已经在某个记录的这个字段里出现过了。如果是,mysql将拒绝插入那条新纪录。也就是说,唯一索引可以保证数据记录的唯一性。
另外需要注意,在 InnoDB 中有且只有一个聚集索引。它有三种情况:
若表存在主键,则主键索引就是聚集索引。
若不存在主键,则会把第一个非空的唯一索引作为聚集索引。
否则,就会隐式的定义一个 rowid 作为聚集索引。
为了方便理解,下边以 InnoDB 的主键索引和普通索引为例,看下它们的存储结构
CREATE TABLE `student` (
`id` int(11) NOT NULL,
`name` varchar