之前已经介绍过,innodb存储引擎是索引组织表,即表中数据按照主键顺序存放。
而聚集索引(clustered index)就是按照每张表的主键构造的一颗B+树,同时叶子节点中存放的即为整张表的行记录数据,也将聚集索引的叶子节点称为数据页。
聚集索引的这个特性决定了索引组织表中数据也是索引的一部分。
同B+树数据结构一样,每个数据页都通过一个双向链表来进行链接。
由于实际的数据页只能按照一颗B+树进行排序,因此每张表只能拥有一个聚集索引。在多少情况下,查询优化器倾向于采用聚集索引。因为聚集索引能够在B+树索引的叶子节点上直接找到数据。此外,由于定义了数据的逻辑顺序,聚集索引能够特别快速的访问针对范围值的查询。查询优化器能够快速发现某一段范围的数据页需要扫描。
许多数据库的文档会告诉读者:聚集索引按照顺序物理的存储数据。如果看上图,可能也会有这样的感觉。但是试想一下,如果聚集索引必须按照特定的顺序存放物理记录,则维护成本显得非常之高。所以聚集索引的存储并不是物理上连续的,而是逻辑上连续的。这其中有两点:一是前面说过的页通过双向链表链接,页按照主键的顺序排序;另一点是每个页中的记录也是通过双向链表进行维护的,物理存储上可以同样不按照主键存储???(考虑主键索引和聚集索引重合和不重合的情况)(见mysql高性能163页(整页详读))mysql内建的存储引擎还不支持选择哪个索引作为聚簇索引,所以只能通过主键聚集数据。Innodb只聚簇同一个页面中的记录。包含相邻键值的页面可能会相聚甚远。