mysql-索引
MyISAM: 索引存放文件数据指针(物理地址),根据指针查询具体的记录 主键和辅助索引都是独立的,都只存放物理地址 INNODB 主键索引存放文件数据,根据主键即可查询数据 辅助索引存放主键索引值,根据辅助索引查到主键索引,再根据主键查询数据 Q: 为何innodb辅助索引存放主键索引, 不直接存放数据? A: 待解决 myisam、innodb索引都采用B+Tree Q: 为何索引是B+Tree结构? A: (1)hash索引, hash(key) 计算后会得到一个唯一值(地址值),这样就不能进行范围、排序查询,也不能进行多条件查询。其时间复杂度O(1) (2)二叉树,在主键自增情况下,数据库插入数据时,会导致二叉树失衡,将退化为链表,这样检索效率很低,其时间复杂度为O(n) (3)红黑树,优化二叉树不平衡问题,但在主键自增情况下,数据库插入大量数据时,红黑树也会慢慢进行偏移且层级会很深,导致查询效率较低,红黑树较二叉树而言,只能保证不会退化为链表,其时间复杂度为O(Log2n)到O(n)之间 (4)最终采用B+Tree,根节点不再是单一的索引值,而是一段范围的索引值,查询数据时,首先会将根节点的一段范围索引值都加载到内存,再根据范围内的索引值可以继续向子节点进行范围内的索引查询,直到在叶子节点上找到对应的数据,
支持横向扩展(根节点及非叶子节点的索引范围不断横向扩大), 解决优化索引的不平衡性
【15】 ---A--- 【30】 ---B--- 【45】
【15】---C--- 【20】 ---D--- 【25】 --- ...
【15】 -- 【17】-- 【19】 -- ...
【zs】 【ls】 【ww】
假设:查询索引为17的数据.
流程:首先会将根节点的15-45范围内的索引加载到内存
根据比较得知17在区间A中(区间A就是一个指针引用,用于查询其子节点), 则在A区间下的子节点进行查找
再进行比较得知17在子区间C中,则在C区间下的子节点进行查找
再进行比较最终匹配17,根据索引17上的指针从而查询到数据 "ls"