myisam和innodb 索引实现原理

b-tree,b是balance,一般用于数据库的索引。使用b-tree结构可以显著减少定位记录时所经历的中间过程,从而加快存取速度

myisam引擎使用b+tree作为索引结构,叶节点的data域存放的是数据记录的地址
myisam索引的原理图:




innodb索引实现
虽然innodb也使用b+tree作为索引结构,但具体实现方式却与myisam截然不同
第一个重大区别是innodb的数据文件本身就是索引文件。从上文知道,myisam索引文件和数据文件是分离的,索引文件仅保存数据记录的地址。而在innodb中,表数据文件本身就是按b+tree组织的一个索引结构,这棵树的叶节点data域保存了完整的数据记录。这个索引的key是数据表的主键,因此innodb表数据文件本身就是主索引
第二个与myisam索引的不同是innodb的辅助索引data域存储相应记录主键的值而不是地址。换句话说,innodb的所有辅助索引都引用主键作为data域

InnoDB索引原理图



总结:

myisam
   -主键索引/非主键索引
    叶子节点上均带有行号,通过行号进行索引
innodb
   -主键索引(聚簇索引)      叶子节点上带有数据
   -非主键索引(第二索引)    叶子节点上带有主键id

myisam属于堆表,数据写入一直累积(concurrent_insert参数设置为2);此时写入性能比innodb好,但是无论是主键查询还是非主键查询,都不可避免的需要二次io(除非能索引内完成字段记录返回)
innodb属于聚簇索引组织表(主键索引即数据),由于必须保证索引有序,在写入时需要找到合适的位置进行插入,有时候还会导致二叉树调整所以写入性能比myisam要差;但是主键查找时只需要一次io即可返回数据,非主键索引查询时如果在索引内不能完成查询记录返回则需要第二次的io

你可能感兴趣的:(java)