索引底层原理
1MyISAM 和 InnoDB 是MySQL的两代搜索引擎; 区别在于,对于辅助索引的实现原理不一样,并且MyISAM是索引和文件分离的,而InnoDB不是;
2.innodb存储引擎默认MySQL使用B+Tree实现其索引结构。
3.索引文件存储在磁盘中,要想使用索引,存储引擎会按页(磁盘块最大16K)读取磁盘数据到内存当中,(想要提高效率就要降低io读取次数,提高效率)。一次io操作读页的整数倍(物理相邻导致可能包含很多无用数据)
二叉查找树---------任何最小单位的子树的左键值小于根键值,右键值大于根键值,使用中序排序可到到升序排列
AVL----------平衡二叉查找树(任何节点的左右子树高度相差最大为1)
B树----------平衡多路查找树
一页的数据量是有限的,一页数据包含多个数据段(指针+主键+整行数据记录)
主键是有序的将主键分割成多个区间,每个区间有一个指针,指针指向下个区间磁盘块的地址。
整行数据记录如果过大就会增加树的深度,增加io操作
并且对于区间查询不能很好支持
B+树---------平衡多路查找树优化
对B树优化以后,除了叶子节点每页多个数据段只存储(指针+主键 )约16字节,16k/16字节=1000,三层可以存储10亿调数据。叶子节点存储的是所有的数据记录,并且每条记录还包含指向下条记录的指针,形成一个链表的形式,所有的主键都会在叶子结点命中,B+树会有两个指针,一个指向根节点,一个指向主键最小的叶子结点,所以有两种查找方式:a根据主键分页查找和范围查找,b根据根节点的随机查找。
聚集索引索引(主键)--------一般是自增有序的。如果是是无序的,如果有修改主键就必须要重构索引。叶子节点包含整行记录数据,
辅助索引---------允许重复,并且叶子节点只保存聚集索引(主键)的值,然后根据主键去主键索引查找所有对应的数据,整个过程要查询两个索引树结构,InnoDB存储引擎会遍历辅助索引找到主键,然后再通过主键在聚集索引中找到完整的行记录数据
MyISAM更是索引和文件分离,B+树的叶子结点的数据域存放的是文件内容的地址,主索引和辅助索引的B+树都是如此,那么如果我改变了一个地址,是不是所有的索引树都得改变,正如前面我们讲的在磁盘上频繁的读写操作是效率很低的,而这块又不适用局部原理,因为逻辑上相邻的结点,物理上不一定相邻,那么这样就会造成效率上的降低;
InnoDB,它让除了主索引以外的辅助索引的叶子结点的数据域都保存主键,先通过辅助索引找到主键,然后通过主键找到叶子结点的所有数据,遍历了两棵树,但是,这样如果有了修改的话,改变的只是辅助索引,其它索引都不用动,
评价索引:索引的好坏就是要看i/o操作次数