1.B+树和b-树的区别
b-树是一个多路自平衡的的搜索树,她类似于普通的平衡二叉树,不同的一点是b-树允许每个节点有更多的子节点,
b-树具有如下特点
1.所有的键值分布再整棵树中(索引值和data都在每个节点里)
2.任何一个关键字出现只出现在一个节点中
3.搜索有可能在非叶子节点结束(最好O(1))就能找到数据
4.在关键字全集里做一次查找,性能逼近二分查找
b-树的应用:
b-树是专门为外部存储器设计的,如磁盘,它对于读取和写入大块数据有良好的性能,所以一般用在文件系统及数据库中
延伸:内存访问的时间约为50ns,而磁盘在10ms左右,速度相差了近5个数量级,说明程序大部分时间会阻塞在磁盘io上,因此提高程序性能,只能减少io次数,而对于像avl树和红黑树这类平衡二叉树在设计上无法迎合内存,并且平衡二叉树的高度较高,平衡二叉树是通过旋转来完成平衡的,如果无法一次性加载到内存完成旋转操作
空间局部性原理:
如果一个存储器的某个位置被访问,那么在它附近的位置也会被访问
多叉的好处是降低了高度,
B+树是b树的变形体,也是一种多路搜索树,它与b-树的不同之处在于
1.有k个子树的中间节点包含有k个元素(B树中是k-1个元素),每个元素不保存数据,只用来索引,所有数据都保存在叶子节点。
2.所有的叶子结点中包含了全部元素的信息,及指向含这些元素记录的指针,且叶子结点本身依关键字的大小自小而大顺序链接。
3.所有的中间节点元素都同时存在于子节点,在子节点元素中是最大(或最小)元素
B+树相对于b-树的优势:
1.io次数更少
2.查询性能稳定
3.范围查询简便
平衡二叉树有可能形成线性结构
2.数据库隔离级别,幻读和不可重复读的区别
不可重复读的的重点是修改
同样的条件,你读取过的数据,再次读取出来发现值不一样了
幻读的特点在于新增和删除
同样的条件,第一次和第二次读取的记录数不一样
延伸:事务的隔离级别
1.read_uncomited 读未提交,会造成脏读,不可重复读,幻读
2.read_commited 读已提交,会造成 不可重复读,幻读
3.repeatable_read 防止不可重复读,脏读,但不能避免幻读
4.SERIALIZABLE 此级别下事务是顺序执行的,可以避免上述级别的缺陷,但开销较大