关于聚簇索引的个人理解
首先我们要明白:聚簇索引是基于B+树结构而产生的,整个树中都是以页为单位进行分级、存储的而且只能是搜索条件为主键值时才可能发挥作用。
mysql中innodb存储引擎的B+树的结构是什么样子的?
B+树主要包括:叶子节点、非叶子节点。
叶子节点:是整个B+树最底层的,叶子节点中存储的是用户的真实记录信息和一些行信息及页信息。
非叶子节点:是叶子节点往上的所有节点,包括目录项、根节点等。目录项和叶子节点类似只不过目录项中存储的是目录项记录(包括页号、页中最小主键ID)它也是采用用户记录存储的方式来进行存储的而目录项和目录项是通过双向链表组织起来的。
如果当前B+树有四层(一般不会超过四层)。假设B+树中的所有节点都可以存储1000条记录则意味着可以存储1000的4次方条记录。
mysql中innodb存储引擎的B+树有哪些特点?
使用记录主键的大小进行记录和页的排序:
1.页内的记录是通过主键的大小顺序排成的一个单向链表。
2.各个存放用户记录的页(目录项)也是根据页中的记录的主键大小顺序排成一个双向链表的。
3.各个存放目录项的页也是根据页中记录的主键大小顺序排成一个双向链表的。
以此处为分界线在innodb引擎中满足以上所有条件的B+树我们就称其为聚簇索引,这种聚簇索引innodb引擎会自动创建。在innodb引擎中聚簇索引就是一种存储方式(所有的用户记录都会存储在叶子节点中)也就是我们常说的索引即数据。
聚簇索引有什么优缺点?
优点:根据主键值即可获取用户的真实记录信息因为这些数据时保存在主键节点下的且无需回表。
缺点:如果碰到不规则的主键数据插入或者一些写操作时会造成的行迁移页分裂,当发生行迁移和页分裂时从底层的叶子到各层的非叶子节点都会发生改变这样的操作开销是很大的。
查找的时候会发什么?
在聚簇索引中查找记录时只要符合索引的使用规则即可。它会先访问根节点然后根据二分法判断该去哪个目录项中去查找,然后在目录项中继续使用二分法定位到具体的数据页中接着继续用二分法在具体数据页中找到数据所在的具体的槽号并返回信息,这里也可能出现数据不存在的请。
编辑数据时会发生什么?
在聚簇索引编辑数据的时候会根据具体的sql语句来调整各层级内的页中的信息,例如行迁移页的拆分等等。所以聚簇索引在编辑操作时维护成本是比较高的。
此处单独提一下myisma引擎中的索引,它和二级索引很像但是它的叶子节点存储的是索引值和内存地址和innodb中的索引还有有些不同的。