zoukankan      html  css  js  c++  java
  • Innodb的b+树索引结构

    一、innodb索引结构为什么是树结构,不是hash结构。

    hash索引,时间复杂度为O(1),平衡二叉树的时间复杂度为O(lg(n))。但是由于sql查询数据,很多都是范围查询,而树是有序的,hash是无序的,hash定位不到范围数据,所以索引结构是树,而不用hash结构。

    此外,支持hash索引的引擎有:

    innodb自适应hash索引,并不是和普通b+索引一样,我们手动指定哪一行创建还是不创建,而是innodb引擎会监控二级索引的访问频率,如果频率太高,则自动创建这个二级索引的hash索引,便于下次查找这个数据的时候,不需要通过b+树定位这个索引,而是直接hash找到这个索引。
    当然,可以关闭innodb_adaptive_hash_index 这个变量来关闭自适应hash索引。

    二、索引结构为什么是 b+ 树

    平衡二叉树

    在数据结构中,平衡二叉树,是有序查找效率很高的树,但是,数据一多,树的高度会很高,每个节点存储一个数据,那么在以叶为单位访问磁盘的时候,会造成很多次磁盘io。

    b树

    一个节点存储很多个数据,而且不是二叉,而是n叉,同时,跟平衡二叉树一样,节点有序。
    这样的结构,结果就是,当一个节点的大小为页的大小的时候(一页的大小是4k),每次读取,都能读取一个节点的数据,读取到内存,再在内存中处理,速度会非常快。同时由于节点存储的数据很多(4k),树的高度不会很大,也就3到4级。

    b+树

    b+树和b树的区别是:b+树,1、非叶子节点不存储记录,记录都是存储在叶子节点上。2、叶子节点之间有链表关联。
    这样,1、在范围查找的时候,直接找到最大,最小的值,然后进行链表遍历就能找到所有数据,不需要再进行树遍历。2、非叶子节点存储pk,叶子节点存储记录,记录之间存储的会更加紧密,遍历pk的时候,读取一页数据进内存,这页数据都是pk,而没有实际的记录,所以查找会更快。


    转自:https://www.jianshu.com/p/931f65f4a753

  • 相关阅读:
    Leetcode 58. 最后一个单词的长度 双指针
    Leetcode 125. 验证回文串 双指针
    拜托,大厂做项目可不简单!
    被问懵了:一个进程最多可以创建多少个线程?
    面对祖传屎山代码应该采用的5个正确姿势
    VUE代码格式化配置vetur、eslint、prettier的故事
    如何快速实现一个虚拟 DOM 系统
    NodeJS 进程是如何退出的
    [堆][启发式合并]luogu P3261 [JLOI2015]城池攻占
    [Trie][堆]luogu P5283 [十二省联考2019]异或粽子
  • 原文地址:https://www.cnblogs.com/shiliuye/p/13194930.html
Copyright © 2011-2022 走看看