聚簇索引(密集索引)文件中的每个搜索码值都对应一个索引值(叶子节点不仅保存了键值,还保存了位于同一行记录中的其他列的信息),因为聚簇索引决定了表的物理排列顺序,而一个表只能有一种物理排列顺序,所以一个表只能创建一个聚簇索引。
非聚簇索引(稀疏索引)文件只为索引码的某些值建立索引项(叶子节点仅保存了键值以及该行数据的地址)。
数据库必须要有索引,没有索引则检索过程变成了顺序查找(全表扫描),O(n)的时间复杂度几乎是不能忍受的。我们非常容易想象出一个只有单关键字组成的表如何使用B+树进行索引,只要将这个关键字存储到B+树的节点即可。当数据库一条记录里包含多个字段时,一棵B+树就只能存储主键,如果检索的是非主键字段,则主键索引失去作用,又变成顺序查找(全表扫描)了。这时应该在第二个要检索的列上建立第二套索引(辅助键索引),这个索引由独立的B+树来组织。有两种常见的方法可以解决多个B+树访问同一套表数据的问题,一种叫做聚簇索引(数据和索引存储在一块,索引结构的叶子节点保存了行数据),一种叫做非聚簇索引(数据和索引分开存储,索引结构的叶子节点存储的是指向存放数据的物理块的指针)。
目前,MySQL数据库使用的比较主流的存储引擎有InnoDB和MyISAM,其中InnoDB存储引擎使用的是聚簇索引,而MyISAM存储引擎使用的是非聚簇索引。
InnoDB存储引擎使用聚簇索引并且有且仅有一个聚簇索引(因为聚簇索引决定了表的物理排列顺序,而一个表只能有一种物理排列顺序,因此一个表只能创建一个聚簇索引)。若有一