聚簇索引和非聚簇索引
聚簇索引和非聚簇索引
简单来说:
聚簇索引就是将数据和索引存储在一块,索引结构的叶子结点保存了数据。
非聚簇索引就是将数据和索引存储在一块,索引结构的叶子结点指向了数据对应的数据。
在InnoDB中主键使用的时聚簇索引。MyISAM不管是主键索引还是二级索引都是使用的非聚簇索引。
聚簇索引
The InnoDB term for a primary key index. InnoDB table storage is organized based on the values of the primary key columns, to speed up queries and sorts involving the primary key columns. For best performance, choose the primary key columns carefully based on the most performance-critical queries. Because modifying the columns of the clustered index is an expensive operation, choose primary columns that are rarely or never updated
**The InnoDB term for a primary key index(InnoDB术语,表示主键索引). **
因为索引和数据是一起存储的,因此我们找到了索引就找到了数据。
在InnoDB中,表中一定会有主键,如果没有自定义主键,那么InnoDB会选择一个唯一且非空的索引来代替。如果没有索引,InnoDB会隐式的定义一个主键来作为聚簇索引。
主键使用聚簇索引,因此通过主键构造一棵B+树,叶子结点全是数据。我们通过主键索引,可以快速的查找到我们需要的数据。
在InooDB 中,我们定义除主键索引之外的索引,称为辅助索引(唯一索引,多列索引等)。辅助索引叶子结点存储的不再是行的物理位置,而是主键值,通过这个主键值,可以从主键所用构建的B+树快速查找数据。
非聚簇索引
MyISAM使用的是非聚簇索引,索引的存储和数据的存储是分离的,也就是说找到了所以但没找到数据,需要根据索引上的值(主键)再次回表查询,非聚簇索引也叫做辅助索引。
在MyISAM中,主键索引构建的B+树中,叶子结点存储了主键,辅助索引构建的B+树中,叶子结点存储了辅助索引。
索引的叶子节点都指向对应的数据。
聚簇索引和非聚簇索引对比
对于InnoDB来说:每次使用辅助索引都要经过两次B+树查询。对于MyISAM来说,使用辅助索引只需一次B+树查询。
看上去非聚簇的索引效率更高,InnoDB为何会使用非聚簇索引。
行数据和聚簇索引的叶子结点存储在一起,同一页中会有多条数据,访问同一数据页不同的行记录时,已经把页加载到了Buffer中(缓存器),再次访问时,会在内存中访问,不必访问磁盘。
在InnoDB中,辅助索引的叶子结点存储的是主键值,而不是地址值。
因为MyISAM的主索引并非聚簇索引,那么他的数据的物理地址必然是凌乱的,拿到这些物理地址,按照合适的算法进行I/O读取,于是开始不停的寻道不停的旋转。聚簇索引则只需一次I/O。