数据库学习

InnoDB事务隔离级别

read uncommited :读到未提交数据

read committed: 脏读,不可重复读

事务执行中,如果第一次查询为A,其他事务修改了改值,则第二次查询时会查到修改后的值B

事务1:select *from test 
A
事务2修改test 为B
事务1再次查询test:select *from test 
B

repeatable read:可重读

事务执行中,如果第一次查询为A,其他事务修改了改值,则第二次查询时还是查询到A.
使用版本号和字段号实现

事务1:select *from test 
A
事务2修改test 为B
事务1再次查询test:select *from test 
A

serializable :串行事物

数据库索引

都怪年轻没有好好学数据库和数据结构(主要当时无法理解),现在才来补救。我们通常说提高数据库读写效率用索引,而索引的底层是用B+树/hash来实现的,今天讨论的就是B+树和B+树之前的B树。

磁盘I/O

首先我们电脑存储用的磁盘,通过在磁盘上一圈一圈填写1/0来保存我们的数据,向磁盘中存储和读取的过程叫磁盘 I/O。磁盘的读取方式和速度会严重影响到整个业务的计算性能。而磁盘读写是通过机械运动写上去,比起电信号会慢很多,这就是为什么内存比缓存慢的多的原因。所以提高磁盘I/O速度只能:

  1. 尽量减少 I/O 次数,比如可以使用缓存;
  2. 每次 I/O 尽量获取更多的数据;
  3. 每次 I/O 尽量获取有用的数据,当然相应的也间接减少总
    I/O 次数;

二分查找树

我们知道要查找一样东西,一个个去找很麻烦,最坏的情况需要每一个都查找一遍。所以就有了我们的查找算法,其中就有一种叫二分查找的方法,数据先排序再比较中间节点,找数据在哪一边,再重复这个过程直到找到为止。但是每次需要找到中间节点很麻烦,这个时候我们就想到用树这种数据结构,把每个中间节点存储起来,就是二分查找树。二分查找树就是通过数据结构的方式实现了二分查找算法,通过存储中间节点的数据,弥补了二分查找每次都要计算中间位置的缺点。
二分查找树

平衡二叉树

如果二分查找树不断进行修改,比如删除某些节点,经过一段时间后,最早那个中间节点的数据(根),很可能就不在中间了。二分查找算法的关键在于有序和中间节点,而二分查找树的关键是中间节点的维护,如果维护的节点已经不在中间了,那么它就失去了意义。
所以必须保证「二分查找树」是一个正确的树,一个根节点在中心的树,一个左右子树层级(高度)基本相等(高度相差不超过1)的树,一个平衡的树,就是平衡二叉树。
平衡二叉树 = 二分查找树 + 平衡(左右高度相差不超过 1 )
平衡二叉树中最常见的就是红黑树,红黑树规定了一系列节点颜色规则,以及对应的左旋和右旋操作来保证颜色规则,从而达到树的平衡性。
在这里插入图片描述

多叉树

二分查找树可以减少查找次数提高查找效率,那么多叉树把区域分得更多更能提高效率。
在这里插入图片描述
多叉树是在二分查找树的基础上,增加单个节点的数据存储数量,同时增加了树的子节点数,一次计算可以把查找范围缩小更多。
优点:二叉平衡树的基础上,使加载一次节点,可以加载更多路径数据,同时把查询范围缩减到更小。

B树

在我们实际应用场景里不可能只有数字,肯定会带有业务数据
在这里插入图片描述
像这种索引数据与树排序查找无关的业务一起维护在节点的平衡多叉(阶)树称为 B- 树( B 树)。
缺点:业务数据的大小可能远远超过了索引数据的大小,每次为了查找对比计算,需要把数据加载到内存以及 CPU 高速缓存中时,都要把索引数据和无关的业务数据全部查出来。本来一次就可以把所有索引数据加载进来,现在却要多次才能加载完。如果所对比的节点不是所查的数据,那么这些加载进内存的业务数据就毫无用处,全部抛弃。

B+树

因为存在业务数据导致数据量庞大,索引数据与业务绑定在一块,而业务数据的大小很有可能远远超过了索引数据,这会大大减小一次 I/O 有用数据的获取,间接的增加 I/O 次数去获取有用的索引数据。
就有了B+树这种结构,B+ 树中,非叶子节点只保存索引数据,叶子节点保存索引数据与业务数据。这样即保证了叶子节点的简约干净,数据量大大减小,又保证了最终能查到对应的业务数。既提高了单次 I/O 数据的有效性,又减少了 I/O 次数,还实现了业务。
在这里插入图片描述
进一步优化把业务数据替换成地址存进去,每次获取地址再去找到实际业务数据
在这里插入图片描述

总结

  1. 数据存储在磁盘( SSD 跟 CPU 性能也不在一个量级),而磁盘处理数据很慢; 提高磁盘性能主要通过减少 I/O 次数,以及单次I/O 有效数据量;
  2. 索引通过多阶(一个节点保存多个数据,指向多个子节点)使树的结构更矮胖,从而减少 I/O 次数;
  3. 索引通过B+ 树,把业务数据与索引数据分离,来提高单次 I/O 有效数据量,从而减少 I/O 次数;
  4. 索引通过树数据的有序和「二分查找」(多阶树可以假设为多分查找),大大缩小查询范围;
  5. 索引针对的是单个字段或部分字段,数据量本身比一条记录的数据量要少的多,这样即使通过扫描的方式查询索引也比扫描数据库表本身快的多;
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值