在看《MySQL技术内幕:InnoDB存储引擎》B+树索引章节中看到这么一句话:

但是B+索引在数据库中有一个特点就是高扇出性,因此在数据库中,B+树的高度一般都在2-4层,也就是说查找某一键值的行记录时最多只需要2-4次IO。因为当前一般的机械磁盘每秒至少可以做100次IO,2-4次的IO意味着查询时间只需要0.02-0.04秒。

那么,当一个表很大的时候,索引还是是2-4层吗?那么这时搜索子节点会不会很慢?

下面通过user库中的uc_users表,来验证一下。
表结构如下:

CREATE TABLE `uc_users` (`id` bigint(20) NOT NULL AUTO_INCREMENT,`username` varchar(40) DEFAULT NULL COMMENT 'username (login principal)',`connection_id` bigint(20) DEFAULT NULL COMMENT 'username (login principal)',`email` varchar(254) DEFAULT NULL COMMENT 'email (login principal)',`email_verified` tinyint(1) NOT NULL DEFAULT '0',`phone_number` varchar(20) DEFAULT NULL COMMENT 'mobile phone number (login principal?)',`phone_verified` tinyint(1) NOT NULL DEFAULT '0',`display_name` varchar(40) DEFAULT NULL COMMENT 'name for displaying',`nickname` varchar(40) DEFAULT NULL COMMENT 'nickname',`given_name` varchar(40) DEFAULT NULL COMMENT 'given name or first name',`family_name` varchar(40) DEFAULT NULL COMMENT 'family name or surname',`middle_name` varchar(40) DEFAULT NULL COMMENT 'middle name',`avatar_url` varchar(2000) DEFAULT NULL COMMENT 'avatar image url',`password` varchar(255) DEFAULT NULL COMMENT 'password hash (login credential)',`password_strength` int(11) DEFAULT NULL COMMENT 'password strength',`enabled` tinyint(1) NOT NULL DEFAULT '1',`locked` tinyint(1) NOT NULL DEFAULT '0',`type` smallint(6) NOT NULL COMMENT 'type (for lite-auth)',`source` varchar(100) DEFAULT NULL COMMENT 'where user come from',`last_login_at` timestamp NULL DEFAULT NULL,`gender` varchar(10) DEFAULT NULL,`birth_date` varchar(10) DEFAULT NULL,`zone_info` varchar(20) DEFAULT NULL,`locale` varchar(20) DEFAULT NULL,`website` varchar(2000) DEFAULT NULL,`address` varchar(1000) DEFAULT NULL,`metadata` varchar(5000) DEFAULT NULL,`created_at` timestamp NULL DEFAULT NULL,`updated_at` timestamp NULL DEFAULT NULL,`external_source` varchar(255) DEFAULT NULL,`external_id` varchar(255) DEFAULT NULL,`reg_client_id` varchar(128) DEFAULT NULL,`version` int(11) DEFAULT NULL,PRIMARY KEY (`id`),KEY `index_phone_number` (`phone_number`),KEY `index_email` (`email`),KEY `index_username` (`username`),KEY `index_created_at` (`created_at`),KEY `index_updated_at` (`updated_at`)
) ENGINE=InnoDB AUTO_INCREMENT=2022228456 DEFAULT CHARSET=utf8 COMMENT='user table';

索引信息如下:

数据量:5968 8046

查看index level 通过innodb_ruby查看。
具体语法参见:https://github.com/jeremycole/innodb_ruby/wiki

方法一

1、登陆mysql对应机器,找到mysql数据存放位置

ps -ef | grep mysql


2、找到ibdata文件位置

3、执行如下命令

 innodb_space -s ibdata1 -T user/uc_users space-indexes

执行结果如下:

  • id:表示此索引的ID。

  • name:索引的名称,PRIMARY代表的就是聚集索引,因为InnoDB表是聚集索引组织表,行记录就是聚集索引;idx_c就是辅助索引的名称。

  • root:索引中根节点的page号,可以看出聚集索引的Root节点是第3号page(前0、1、2号Page已经被使用),辅助索引的根节点是第4、5、6、7、8个page。

  • fseg:page的说明,internal表示非叶子节点或属于根节点,leaf表示叶子节点(也就是数据页)。

  • used:索引使用了多少个page,可以看出聚集索引的非叶子节点使用了1819个page,叶子节点使用了1112265个page。

  • allocated:索引分配了多少个page,可以看出聚集索引的非叶子节点分配了2522个page,叶子节点分配了1271136个page。

  • fill_factor:索引的填充度,used/allocated表示填充度,也就是实际使用的大小百分比。

现在我们知道了Root节点页后,就可以使用innodb_ruby的另外一个功能,打印页结构信息,需要了解InnoDB页结构。

# 这里查看是索引中根节点的page号为3的索引信息 即主键索引id列
# 从返回结果中可以看到index_id=>55
innodb_space -s ibdata1 -T user/uc_users -p 3 page-dump

执行结果如下:

[root@uoc-db2 mysql3306]# innodb_space -s ibdata1 -T user/uc_users -p 3 page-dump
#<Innodb::Page::Index:0x00000002dc04b8>:fil header:
{:checksum=>2973709054,:offset=>3,:prev=>nil,:next=>nil,:lsn=>47538913608,:type=>:INDEX,:flush_lsn=>0,:space_id=>31}fil trailer:
{:checksum=>2973709054, :lsn_low32=>294273352}page header:
{:n_dir_slots=>2,:heap_top=>225,:garbage_offset=>192,:garbage_size=>42,:last_insert_offset=>0,:direction=>:left,:n_direction=>1,:n_recs=>3,:max_trx_id=>0,:level=>3,:index_id=>55,:n_heap=>7,:format=>:compact}fseg header:
{:leaf=><Innodb::Inode space=<Innodb::Space file="user/uc_users.ibd", page_size=16384, pages=2044416>, fseg=2>,:internal=><Innodb::Inode space=<Innodb::Space file="user/uc_users.ibd", page_size=16384, pages=2044416>, fseg=1>}sizes:header           120trailer            8directory          4free           16189used             195record            63per record     21.00page directory:
[99, 112]system records:
{:offset=>99,:header=>{:next=>129,:type=>:infimum,:heap_number=>0,:n_owned=>1,:min_rec=>false,:deleted=>false,:length=>5},:next=>129,:data=>"infimum\x00",:length=>8}
{:offset=>112,:header=>{:next=>112,:type=>:supremum,:heap_number=>1,:n_owned=>4,:min_rec=>false,:deleted=>false,:length=>5},:next=>112,:data=>"supremum",:length=>8}garbage records:
{:format=>:compact,:offset=>192,:header=>{:next=>171,:type=>:node_pointer,:heap_number=>5,:n_owned=>0,:min_rec=>false,:deleted=>false,:nulls=>[],:lengths=>{},:externs=>[],:length=>5},:next=>171,:type=>:clustered,:key=>[{:name=>"id", :type=>"BIGINT", :value=>2002372990}],:row=>[],:sys=>[],:child_page_number=>1206485,:length=>12}{:format=>:compact,:offset=>171,:header=>{:next=>171,:type=>:node_pointer,:heap_number=>4,:n_owned=>0,:min_rec=>false,:deleted=>false,:nulls=>[],:lengths=>{},:externs=>[],:length=>5},:next=>171,:type=>:clustered,:key=>[{:name=>"id", :type=>"BIGINT", :value=>55861094}],:row=>[],:sys=>[],:child_page_number=>948104,:length=>12}records:
{:format=>:compact,:offset=>129,:header=>{:next=>150,:type=>:node_pointer,:heap_number=>2,:n_owned=>0,:min_rec=>true,:deleted=>false,:nulls=>[],:lengths=>{},:externs=>[],:length=>5},:next=>150,:type=>:clustered,:key=>[{:name=>"id", :type=>"BIGINT", :value=>1}],:row=>[],:sys=>[],:child_page_number=>375704,:length=>12}{:format=>:compact,:offset=>150,:header=>{:next=>213,:type=>:node_pointer,:heap_number=>3,:n_owned=>0,:min_rec=>false,:deleted=>false,:nulls=>[],:lengths=>{},:externs=>[],:length=>5},:next=>213,:type=>:clustered,:key=>[{:name=>"id", :type=>"BIGINT", :value=>47377252}],:row=>[],:sys=>[],:child_page_number=>948104,:length=>12}{:format=>:compact,:offset=>213,:header=>{:next=>112,:type=>:node_pointer,:heap_number=>6,:n_owned=>0,:min_rec=>false,:deleted=>false,:nulls=>[],:lengths=>{},:externs=>[],:length=>5},:next=>112,:type=>:clustered,:key=>[{:name=>"id", :type=>"BIGINT", :value=>68265101}],:row=>[],:sys=>[],:child_page_number=>1644800,:length=>12}

页结构信息中有一个level字段,表示的就是Root节点页的高度,同样,level + 1就等于这个索引的高度。

比如再看看phone_number索引列(page号为4),结果如下:
https://github.com/jiankunking/backups/blob/master/mysql/index/phone_number.page.contents

方法二

1、查看innodb_page_size

SHOW GLOBAL STATUS LIKE 'Innodb_page_size';

执行结果如下:

2、通过hexdump这样的工具就可以快速定位到所需要的树高度信息

 hexdump -s 49216 -n 02 uc_users.ibd

执行结果如下:

查看uc_users表,49216表示的是316384+64(这里innodb_page_size设置为了16384,如果是8192就是38192),即第3个页偏移量64位置开始读取2个字节,这里PAGE_LEVEL为00 03,那么索引的高度就为4。

本文参考:《查看InnoDB表每个索引的高度?》

个人微信公众号:

作者:jiankunking 出处:http://blog.csdn.net/jiankunking

查看MySQL InnoDB 表索引的高度相关推荐

  1. mysql 排序后 下一条记录_什么是MySQL InnoDB 二级索引的排序?|附实例详解

    概述 今天主要给大家介绍了关于MySQL InnoDB 二级索引的排序的相关资料,通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值. 每个InnoDB表具有一个特殊的索引称为聚簇 ...

  2. 查看mysql数据表结构的两种方法你会吗?

    教你如何查看数据表结构 当我们创建完表之后,如何查看表结构,以便于确认该表符合我们的预期呢,我们可以使用describe或者show create table命令来查看mysql数据表结构,下面我们就 ...

  3. 查看mysql当前表使用的存储引擎(转)

    说明: 当我们创建表 "test"表时 CREATE TABLE test ( id INT(11) default NULL auto_increment, s char(60) ...

  4. MySQL InnoDB表压缩

    MySQL InnoDB表压缩 文件大小减小(可达50%以上) ==> 查询速度变快(count * 约减少20%以上时间) 如何设置mysql innodb 表的压缩: 第一,mysql的版本 ...

  5. 查看MySQL数据库表的命令介绍

    如果需要查看MySQL数据库中都有哪些MySQL数据库表,应该如何实现呢?下面就为您介绍查看MySQL数据库表的命令,供您参考. 进入MySQL Command line client下 查看当前使用 ...

  6. mysql怎么命令查看表的数据_查看MySQL数据库表的命令介绍

    如果需要查看MySQL数据库中都有哪些MySQL数据库表,应该如何实现呢?下面就为您介绍查看MySQL数据库表的命令,供您参考. 进入MySQL Command line client下 查看当前使用 ...

  7. cmd查看mysql数据库表_cmd中查看MySQL数据库表数据及结构

    0. 1 .cmd进入mysql安装的bin目录(C:\Program Files\XXXXXX\MySQL Server 5.6\bin) mysql -hlocalhost -uroot -p 回 ...

  8. MySQL Innodb表导致死锁日志情况分析与归纳

    案例描述 在定时脚本运行过程中,发现当备份表格的sql语句与删除该表部分数据的sql语句同时运行时,mysql会检测出死锁,并打印出日志. 两个sql语句如下: (1)insert into back ...

  9. mysql innodb表损坏_MySQL数据库INNODB表损坏修复处理过程分享

    ##状况描述 突然收到MySQL报警,从库的数据库挂了,一直在不停的重启,打开错误日志,发现有张表坏了.innodb表损坏不能通过repair table 等修复myisam的命令操作.现在记录下解决 ...

最新文章

  1. 转置卷积Transposed Convolution
  2. 腾讯 QQ 就“读取浏览器历史记录”道歉!
  3. python爬虫 发送定时气象预报
  4. 2015年你必须学习的编程语言和前端框架
  5. Java Review - 使用Timer时需要注意的事情
  6. java设计模式 单例_java设计模式一(单例模式singleton)
  7. service不是内部或者外部命令
  8. Linux基础学习导图
  9. ugui用户定义操作按键
  10. jquery之统计数字parseFloat
  11. 推送后更改git commit消息(假设没有人从远程拉出)
  12. 【车辆识别】基于matlab GUI小波和盒维数车型识别【含Matlab源码 727期】
  13. eclipse 自动下载源码插件
  14. 成功在中东和北非地区发布应用或游戏的 7 个技巧
  15. 实战项目-小说网站开发过程中难点记录(1)
  16. 档案管理系统项目总结
  17. 点击pv转化率_互联网中一些常用指标(PV、UV、蹦失率、转换率、退出率)
  18. 北京移动长漫亲情省业务(长途、漫游超便宜)
  19. 《当程序员的那些狗日日子》(八)床上等你
  20. 图像极坐标变换的研究

热门文章

  1. C++学习(六) 常引用、常对象、常对象成员、常成员函数
  2. Pay more attention to attention...Sergey Zagoruyko论文解读及代码解释
  3. 小程序获取dom节点方法总结
  4. 【Python练手】抽奖概率测试 - 怎么才能知道获得1w块的概率,真的真的就是万分之一呢?
  5. JAVA中十六进制与字符串的转换
  6. 全选快捷键ctrl加什么 全选快捷键ctrl加哪个键 全选是ctrl加什么?
  7. 2018年蓝桥国赛c/c++组真题解析
  8. 基于单片机的电梯仿真系统
  9. 无线AP与无线路由器的区别?什么是无线AP?
  10. Java中toString的用法/作用