myisam和innodb 索引实现原理
2016-09-05 19:47
537 查看
b-tree,b是balance,一般用于数据库的索引。使用b-tree结构可以显著减少定位记录时所经历的中间过程,从而加快存取速度
myisam引擎使用b+tree作为索引结构,叶节点的data域存放的是数据记录的地址
myisam索引的原理图:
![](https://oscdn.geek-share.com/Uploads/Images/Content/201908/31/fe519afa9856632439e9e9b29fbdf457)
innodb索引实现
虽然innodb也使用b+tree作为索引结构,但具体实现方式却与myisam截然不同
第一个重大区别是innodb的数据文件本身就是索引文件。从上文知道,myisam索引文件和数据文件是分离的,索引文件仅保存数据记录的地址。而在innodb中,表数据文件本身就是按b+tree组织的一个索引结构,这棵树的叶节点data域保存了完整的数据记录。这个索引的key是数据表的主键,因此innodb表数据文件本身就是主索引
第二个与myisam索引的不同是innodb的辅助索引data域存储相应记录主键的值而不是地址。换句话说,innodb的所有辅助索引都引用主键作为data域
InnoDB索引原理图
![](https://oscdn.geek-share.com/Uploads/Images/Content/201908/31/87e5c22bab834db7cfad209b6c396fc3)
总结:
myisam
-主键索引/非主键索引
叶子节点上均带有行号,通过行号进行索引
innodb
-主键索引(聚簇索引) 叶子节点上带有数据
-非主键索引(第二索引) 叶子节点上带有主键id
myisam属于堆表,数据写入一直累积(concurrent_insert参数设置为2);此时写入性能比innodb好,但是无论是主键查询还是非主键查询,都不可避免的需要二次io(除非能索引内完成字段记录返回)
innodb属于聚簇索引组织表(主键索引即数据),由于必须保证索引有序,在写入时需要找到合适的位置进行插入,有时候还会导致二叉树调整所以写入性能比myisam要差;但是主键查找时只需要一次io即可返回数据,非主键索引查询时如果在索引内不能完成查询记录返回则需要第二次的io
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
相关文章推荐
- 第二周项目3--体验复杂度--汉诺塔
- UVA - 10534 Wavio Sequence (二分法最长上升子序列)
- Uva11992 Fast Matrix Operations(线段树区间修改+更新)
- CSS引入的方式以及 link和@import的区别
- UVALive
- 树之二叉树遍历先序,中序,后序
- 关于LeetCode中Swap Nodes in Pairs一题的理解
- Java多线程设计模式
- ROS Learning-013 beginner_Tutorials (编程) 编写ROS服务版的Hello World程序(Python版)
- ROS Learning-013 beginner_Tutorials (编程) 编写ROS服务版的Hello World程序(Python版)
- django migrations模块错误
- 第二周项目五 汉诺塔
- CSU 1806 Toll(自适应simpson积分)
- python supervisoe
- 落单的数
- 离散傅里叶变换库,DFT,FFTW
- ACdream1093-matrices女神的正多面体(矩阵快速幂)
- 判断控件是否在屏幕的显示范围内
- 网络设备解析:中继器、集线器、网桥、交换机、路由器、网关的区别
- 9.5总结