为什么b+树来实现索引而不是红黑树。MVCC怎么理解?
两点:
1.数据库存储数据量较多的时候,b+树高度稳定,多为3,而红黑树高度则肯定大于3,而对于数据读取来讲,高度一般决定乐磁盘io的次数,磁盘io次数越少则效率越高。
2.支持范围查找,比如叶子节点数据好比是一个双向链表,这样查找的时候就可以范围查询,而红黑树并不可以。
MVCC:
多版本并发控制,为了解决什么数据库的并发冲突,数据库的并发冲突有1.读和读的并发(并不会产生并发问题) 2.读和写的并发(出现脏读幻读不可重复读,概念百度即可) 3.写和写的并发(数据的更新的丢失问题)
mvcc就是为了解决读写冲突的,读写冲突也可以使用悲观锁来解决,但是效率不高,引出概念:当前读,快照读, 数据库的隐式字段,Undo日志,Readview
事务的隔离级别:
读未提交
不可重复读
可重复读
串行化
RC(不可重复读)隔离级别下,是每个快照读都会生成并获取最新的Read View;而在RR(可重复读)隔离级别下,则是同一个事务中的第一个快照读才会创建Read View, 之后的快照读获取的都是同一个Read View。
当前读:不加锁的select读
快照读:在该事务执行的快照读的那一刻,会生成数据库系统当前的一个快照,记录并维护系统当前活跃事务的ID。
三个隐式字段:1.自增id主键 2.回滚指针.3当前事务id(这条数据的当前事务id,事务4执行快照读数据a准备修改a中字段但并未修改,所以此前快照读所读数据应该为最后修改a数据的事务id(不是4))
2.undolog
3.ReadView
readview:
当前活跃事务列表
最小id号的事务活跃
当前活跃最大事务id+1
快照读中的当前事务id号即和readview中的这些数据来比
id<最小id号活跃事物,记录可以被当前事务看到
id大于等于当前活跃最大事务id+1号,记录不能被当前事务访问
id是否在活跃事务列表里,在则看不到,不在则能看到。