zoukankan      html  css  js  c++  java
  • 如何知道btree树的高度

    来自网络,总结到这里:

    当我想看btree树高度的时候,筛选出来这篇文章"为什么 B-tree 在不同著作中度的定义有一定差别?",知道了高度的算法是这个公式:但是里面又提高t和出度有关系,那么这个出度怎么算呢?为此我又搜索到了这里:"B-/+Tree索引的性能分析", d越大索引的性能越好,而出度的上限取决于节点内key和data的大小:

    dmax=floor(pagesize/(keysize+datasize+pointsize))

    floor表示向下取整。

    这篇文章也非常好,但是没有一个明确的方法告诉我innodb的高度怎么看,我被老大说中了,“现在是一个快餐时代”,我也不例外,直到我看到这里:

    通过下面的SQL语句可以查出某这表对应索引的Root页:

    SELECT b.name, a.name, index_id, type, a.space, a.PAGE_NO
    FROM information_schema.INNODB_SYS_INDEXES a,
    information_schema.INNODB_SYS_TABLES b
    WHERE a.table_id = b.table_id AND a.space <> 0;
    或者:
    SELECT b.name, a.name, index_id, type, a.space, a.PAGE_NO
    FROM information_schema.INNODB_SYS_INDEXES a,
    information_schema.INNODB_SYS_TABLES b
    WHERE a.table_id = b.table_id AND a.space <> 0 and name='dbname/tbname';

    运行上述的SQL语句应该可以得到类似如下的结果:

    其中(SPAE,PAGE_NO)就是索引的Root页。

    关于上面的列都是什么意思?

    有了这些信息就可以方便的定位啦,因为PAGE_LEVEL在每个页的偏移量64位置出,占用两个字节,通过hexdump这样的工具就可以快速定位到所需要的树高度信息:

    root@test-1:~# hexdump -s 24640 -n 10 customer.ibd
    00006040 00 02 00 00 00 00 00 00 00 47

    查看customer表,24640表示的是3*8192+64(这里innodb_page_size,查看方法:

    mysql -uroot -e"show global variables like 'innodb_page_size'"; 

    设置为了8192,并非默认的16384),即第3个页偏移量64位置开始读取10个字节,但不是读取2个字节就可以了嘛?其实因为后面8个字节对应的是index_id,就是上图中看到的index为71的索引,这里PAGE_LEVEL为00 02,那么索引的高度就为3。

    用同样的方法可以查看customer表中i_c_nationkey的索引高度:

    root@test-1:~# hexdump -s 32832 -n 10 customer.ibd
    00008040 00 01 00 00 00 00 00 00 00 48

    可以发现PAGE_LEVEL为00 01,表示这棵二级索引树的高度为2。

    虽然通常来说索引树的高度为3~4层,但是极端情况下,比如数据量超级大,页比较小,如4K,那么高度也是可能破4的。

    参考来源:

    https://dev.mysql.com/doc/refman/5.6/en/innodb-sys-indexes-table.html 

  • 相关阅读:
    CSU1784
    HDU 6128 Inverse of sum(数学)
    容斥原理入门
    HDU 6129 Just do it(规律)
    HDU 6140 Hybrid Crystals(zz)
    HDU 6143 Killer Names(排列+容斥,dp)
    zzuli 2177 Contest
    zzuli 2180 GJJ的日常之沉迷数学(逆元)
    除法逆元入门
    乘法逆元数论篇
  • 原文地址:https://www.cnblogs.com/sunss/p/5632976.html
Copyright © 2011-2022 走看看