索引和事务

索引(index):好比书的目录(index) 本质上是为了加快查找的效率
如果数据库中没有索引,那么此时查找的时候就需要把整个表遍历一遍
在这里插入图片描述
如果想找id为8的学生信息,没有索引,此时的查找过程就相当于一个"顺序表查找"
如果是针对数据库顺序查找,数据库的数据时在磁盘上,磁盘访问速度慢,并且数据量也可能非常多,这个速度就会很慢
索引就是为了避免数据库进行顺序查找,提高查找效率

索引可以考虑的数据结构**

二叉树(二叉搜索树),如果比较平衡,查找效率就是O(LogN)

二叉搜索树内部元素是有序的,中序遍历结果是有序的

例如查找id < 6 并且 id > 3 的学生信息

先找到id为6的元素,然后找到id 为3的元素

中序遍历中3和6之间的结果就是想要的结果

效率是o(n)

相比于哈希表,二叉搜索树虽然能处理范围查找,但是效率不高

因为二叉搜索树的每个节点最多两个叉,当数据量大的时候,树的高度就会很高,最终操作效率也会比较低

二叉搜索树直接获取到中序遍历也不是很高效o(n)

2.哈希表查找效率为O(1)

哈希的查找过程 : 把key带入到哈希函数中,计算得到下标,再根据下标取到对应的链表,再去遍历比较key是否相等.

数据库的索引可以考虑使用哈希,但是也有问题

例如: 查找id < 6 并且 id > 3的学生信息

这个时候哈希就不能进行查询

因为哈希表只能处理相等的情况,不能处理其他的逻辑

3.真实的索引结构是一种N叉搜索树
要想认识B+树,要先认识B树(也写做B-(横线,连接符)树)
在这里插入图片描述
B树和二叉树的差异:

  1. 每个节点不是2叉,而是N叉

  2. 每个节点不是存了一个数据,而是可能存多个数据

     仔细观察就能发现,每个节点存的数据的个数和该节点的度是相关的
     度 = 存的数据个数+1
     4和8两个数据把整个数据集合分成了两个区间
     叶子非叶子都是存储数据都放在磁盘上
    

在这里插入图片描述
上图的4和8把整个数据集合切分成了三个区域

其中1 3部分比4小,5 6介于4 8之间,10 11 13比8大

此时要查找元素21,那么先拿21根根结点比,一看比根结点大, 那么就沿着15的右子树进行寻找,找到这个节点,然后看21处于那个范围,发现21处于18-25之间,那么就沿着第二个子结点进行寻找,发现与此节点的21相匹配,

  1. 此时在B树上查找就是一个N分查找,效率就会更高
  2. 由于每个节点存了多个数据,每个节点又有多个度,和二叉树相比,再保存相同个数元素时,B树的高度就会比二叉树低很多
  3. 处理查找也更容易一些
  • 构造过程和二叉搜索树类似,
  • 要先找到合适的位置,再进行插入,
  • 需要考虑当前的值释放到这个节点中
  • 还是给节点下面增加一个节点

B+树
在这里插入图片描述
B+树和B树比

  1. 每一层的元素之间都连接到一起了
  2. 数据值在叶子节点上保存,非叶子节点上只保存一些辅助查找的边界信息(数据就是表中的一行记录).

左下角的14 16 就相当于这一行的id字段
14 21 48 这非叶子结点只保存id,辅助快速找到想要的id对应的节点.

B+树的改进之处:

  • 仍然是N叉树,层级小,非叶子节点不再存储数据,数据只存储在同一层的叶子节点上,B+树从根到每一个节点的路径长度一样,而B树不是这样

  • 叶子之间,增加了链表(图中红色箭头指向),获取所有节点,不再需要中序遍历,使用链表的next节点就可以快速访问到

  • 范围查找方面,当定位min与max之后,中间叶子节点,就是结果集,不用中序回溯(范围查询在SQL中用得很多,这是B+树比B树最大的优势)

  • 叶子节点存储实际记录行,记录行相对比较紧密的存储,适合大数据量磁盘存储;非叶子节点存储记录的PK,用于查询加速,适合内存存储

  • 非叶子节点,不存储实际记录,而只存储记录的KEY的话,那么在相同内存的情况下,B+树能够存储更多索引

  • 查询任何一条记录速度是比较平均的,不会出现效率上的差异

  • 不需要进行额外的中序遍历了,遍历链表就是终须结果,处理范围查找就更高效了

  • 叶子放在磁盘上,非叶子放在内存中,查找效率就更高了,减少了磁盘的读取次数

  • 索引在内存中占用的实际开销也不高

  • 有B树,B+树,但是没有B减树

索引起到的效果
索引可以加快查找效率,减慢插入和删除,修改效率 (需要同步调整索引结果)
索引也会占用额外空间 (用空间换时间)

给具体的表中某列加索引的时候,
加在主键上的索引和加在其他列上的索引是截然不同的
加在主键上的索引叫做主键索引

        应用的场景主要是应用在查找很频繁,但是插入删除修改都不频繁的场景
            
        以作业为例:每次布置作业,都相当于查找数据
            
        插入删除修改操作就非常少,可能一学期就改一次
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值