zoukankan      html  css  js  c++  java
  • 【MySQL】索引的本质(B+Tree)解析

    • 索引是帮助MySQL高效获取数据的排好序数据结构
    • 索引数据结构
      • 二叉树
      • 红黑树
      • Hash表
      • B-Tree
    • MySQL所使用为B+Tree (B-Tree变种)
      • 非叶子节点不存储data只存储索引(冗余),可以放更多的索引(说白了就是每一次索引查询都要查询到叶子节点)
      • 叶子节点包含所有索引字段
      • 叶子节点用指针连接,提高区间访问的性能
    我们看下这个动图来了解一下B+Tree的形成结构: 8 5 15 18 2 11 1 3 6 9 13

     

    最终结构如下:

     如果我们想查找【0013】这个节点,我们来描述一下B+Tree在MySQL中的查找机制:
    
    1》首先将根节点【0008】一次性load到内存中,此时进行了一次磁盘I/O,然后在内存中做随机查找,内存查找可以说是非常快的,时间可忽略不计;
    
    2》由于13大于8,所以接下来我们将节点【0011】load到内存中,以此类推;
    
    3》最终我们定位到【0011 0013】这个节点
    • 通常会有面试这么问:B+Tree索引的节点单位是什么?大小是多少?
    B+Tree聚簇索引索引节点的单位是数据页,默认大小为16K,支持的大小对应选项值为64k,32k,16k,8k,4k
    • 此时我们有1000万个数据构建的B+树索引,那么索引树具体情况是什么样的呢?

    通常我们一个B+树节点大小为16KB,那么一个节点可以放多少索引记录呢?

    我们假设当前这个索引树就是主键索引,1个索引占用存储空间大概是8bytes,

    每个索引还有一个指向下一个节点的指针,大概是6bytes,

    所以一个索引节点大概存放【16kb / 14bytes ≈ 1170(个)】,所以每个节点大概可以放1170个节点,

    由于叶子节点是会存放数据的,可能每个索引占用数据量会大一些,我们就约算为1KB,那么每个索引节点大约可以存放16个数据,所以一个索引树大概一共可以存储多少个元素呢?

    大概可以存放【1170 * 1170 * 16 ≈ 2000万+(个)】索引。

    所以就算千万级的数据,在我们的索引内部都绰绰有余。

    学而不思则罔 思而不学则殆 !
  • 相关阅读:
    题解 P3717 【[AHOI2017初中组]cover】
    【题解】 [POI2012]FES-Festival (差分约束)
    【题解】 [HNOI2005]狡猾的商人(差分约束)
    【题解】 [SCOI2011]糖果 (差分约束)
    【题解】 POJ 1201 Intervals(差分约束)
    【题解】 Codeforces 919F A Game With Numbers(拓扑排序+博弈论+哈希)
    【题解】 [ZJOI2012]灾难 (拓扑排序+LCA)
    【题解】 [HAOI2016]食物链 (拓扑排序)
    【题解】 Luogu P1402 酒店之王 (二分图匹配)
    【题解】 [NOI2009]变换序列 (二分图匹配)
  • 原文地址:https://www.cnblogs.com/boluopabo/p/12861073.html
Copyright © 2011-2022 走看看