MySQL索引和Innodb:
数据页结构,页是innodb存储引擎管理数据的最小磁盘单位,而B-TREE节点就是实际存放表数据结构的节点。
innodb页由七个部分组成:
每一个页面中包含了两对header/trailer:
内部的Page Header/Page Directory 关心的是页的状态信息,
而Fil Header/Fil Trailer 关心的是记录页的头信息
在页的头部和尾部之间就是用户记录和空闲空间了,每一个数据页中
都包含了Infimum和 Supremum 这两个虚拟的记录(可以理解为占位符)
Infimuim 记录时比页中任何逐渐值都要小的值,Supremum 时该页中的最大值
User Records 就是整个页面中真正用于存放行记录的部分,而Free Space 就是空余空间了,
他是一个链表的数据结构,为了保证插入和删除的效率,整个页面并不会按照主键的顺序对所有的
记录进行排序,它会自动从左侧向右寻找空白节点进行插入,行记录在物理存储上并不是按照顺序的,
他们之间的顺序是由next_record指针控制的
B+ 树在查找对应的记录时,并不会直接从树中找出对应的行记录,它只能获取记录所在的页,
将整个页加载到内存中,再通过 Page Directory 中存储的稀疏索引和 n_owned、next_record
属性取出对应的记录,不过因为这一操作是在内存中进行的,所以通常会忽略这部分查找的耗时。
MySQL索引:
索引是数据库中非常重要的一个概念,它主要是存储引擎用来快速定位记录,提升数据库的性能
,减轻数据库服务器的负担的作用。对索引进行优化是对查询性能优化的最有效的手段,他能够轻松的
提高查询的性能,但需要注意的是查询记录时每次只能使用一个索引,因为和全表扫描和只是用一个索引的
速度比起来,去分析两个索引二叉树更耗费时间。
InnoDB 存储引擎在绝大多数情况下使用 B+ 树建立索引,这是关系型数据库中查找最为常用和有效的索引,
但是 B+ 树索引并不能找到一个给定键对应的具体值,它只能找到数据行对应的页,数据库把整个页读入到
内存中,并在内存中查找具体的数据行。
B+ 树是平衡树,它查找任意节点所耗费的时间都是完全相同的,比较的次数就是 B+ 树的高度;
在这里,我们并不会深入分析或者动手实现一个 B+ 树,只是对它的特性进行简单的介绍。
数据库中的 B+ 树索引可以分为聚集索引(clustered index)和辅助索引(secondary index),
它们之间的最大区别就是,聚集索引中存放着一条行记录的全部信息,
而辅助索引中只包含索引列和一个用于查找对应行记录的『书签』。
注:在mysql中,可以把主键理解成聚集索引,如果没有创建,系统会自动创建一个隐含列为表的聚集索引。