数据库为什么要用B+树结构--MySQL索引结构的实现
2024-10-19 00:24:56
原理:
http://www.cnblogs.com/qinpengming/p/5897194.html
本质:
为什么使用B+树?言简意赅,就是因为:
1.文件很大,不可能全部存储在内存中,故要存储到磁盘上
2.索引的结构组织要尽量减少查找过程中磁盘I/O的存取次数(为什么使用B-/+Tree,还跟磁盘存取原理有关。)
3.局部性原理与磁盘预读,预读的长度一般为页(page)的整倍数,(在许多操作系统中,页得大小通常为4k)
4.数据库系统巧妙利用了磁盘预读原理,将一个节点的大小设为等于一个页,这样每个节点只需要一次I/O就可以完全载入,(由于节点中有两个数组,所以地址连续)。而红黑树这种结构,h明显要深的多。由于逻辑上很近的节点(父子)物理上可能很远,无法利用局部性
Mysql存储引擎的区别:
MyISAM :Mysql 默认的存储引擎,如果应用是以读操作和写操作为主,只有很少的更新,删除操作,并对事物的完整性要求不是很高。其优势是访问的速度快
InnoDB: 提供了具有提交,回滚和崩溃恢复能力的事物安全,但是对MyISAM 写的处理效率差一些并且会占用更多的磁盘空间。
InnoDB索引和MyISAM索引的区别:
一是主索引的区别,InnoDB的数据文件本身就是索引文件。而MyISAM的索引和数据是分开的。
二是辅助索引的区别:InnoDB的辅助索引data域存储相应记录主键的值而不是地址。而MyISAM的辅助索引和主索引没有多大区别。
Innodb 存储引擎的 B-Tree 索引实际使用的存储结构实际上是B+Tree ,也就是在 B-Tree 数据结构的基础上做了很小的改造,在每一个Leaf Node 上面出了存放索引键的相关信息之外,还存储了指向与该 Leaf Node 相邻的后一个 LeafNode 的指针信息(增加了顺序访问指针),这主要是为了加快检索多个相邻 Leaf Node 的效率考虑。
MyISAM的索引方式也叫做“非聚集”的,之所以这么称呼是为了与InnoDB的聚集索引区分。
因为InnoDB的数据文件本身要按主键聚集,所以InnoDB要求表必须有主键(MyISAM可以没有),如果没有显式指定,则MySQL系统会自动选择一个可以唯一标识数据记录的列作为主键,如果不存在这种列,则MySQL自动为InnoDB表生成一个隐含字段作为主键,这个字段长度为6个字节,类型为长整形。
不同存储引擎的索引实现方式对于正确使用和优化索引都非常有帮助,例如知道了InnoDB的索引实现后,就很容易明白为什么不建议使用过长的字段作为主键,因为所有辅助索引都引用主索引,过长的主索引会令辅助索引变得过大。再例如,用非单调的字段作为主键在InnoDB中不是个好主意,因为InnoDB数据文件本身是一颗B+Tree,非单调的主键会造成在插入新记录时数据文件为了维持B+Tree的特性而频繁的分裂调整,十分低效,而使用自增字段作为主键则是一个很好的选择。
最新文章
- 提升mysql性能的建议
- Js(DOM) 和Jq 对象的相互转换
- Html5的一些基础知识
- centos6.3安装python2.7, pip2.7, mysql
- js学习心得之思维逻辑与对象上下文环境(一)
- 网上图书商城2--Category模块
- PHP数组处理函数的使用array_map(三)
- eclipse将引用了第三方jar包的java项目打成jar包
- sql server 2008 跨服务器查询
- Mathematica 计算矩阵的伴随矩阵
- 函数os_file_pread
- write a macro to judge big endian or little endian
- Java+7入门经典 -1 简介
- 基于visual Studio2013解决面试题之0907大数乘法
- PAT (Advanced Level) 1075. PAT Judge (25)
- NSTimer的问题
- 芝麻HTTP:TensorFlow LSTM MNIST分类
- Android开发技巧——自定义控件之使用style
- .NET、C#和ASP.NET、ASP.NET MVC四者之间的区别
- 002 Hello Spring Security
热门文章
- mysql 关联查询的执行顺序
- Unity5和WebGL移植指南的一些总结
- CentOS7源码编译安装Postgresql9.5
- Source Insight 3.X utf8支持插件震撼发布
- C和C++混合编程中的extern ";C"; {}
- 使用二级域名访问本地localhost网站
- OC编码问题输出中文
- utils.js
- iOS开发masonry的一些使用简介
- 简单理解call_user_func和call_user_func_array两个函数