前言

很久之前了解到innodb_space,觉得很强大,可视化了InnoDB页面,但是没有形成文档,总结出来,有一些经常被问到的东东可以用这个查看了。

环境

centos 7
Linux 3.10.0-693.2.2.el7.x86_64 #1 SMP Tue Sep 12 22:26:13 UTC 2017 x86_64 x86_64 x86_64 GNU/Linux
Server version: 5.7.20 MySQL Community Server (GPL)

安装

sudo yum install rubygems ruby-devel
sudo gem install innodb_ruby

解读

总述

选项

  1. -f 加载表空间,如ibd文件
  2. -s 加载系统表空间,如ibd
  3. -T 指定表名
  4. -I 指定索引名

继续拿这个表做例子:

mysql> show create table sbtest1\G
*************************** 1. row ***************************Table: sbtest1
Create Table: CREATE TABLE `sbtest1` (`id` int(11) NOT NULL AUTO_INCREMENT,`gmt_create` datetime NOT NULL,`gmt_modified` datetime NOT NULL,`k` int(11) NOT NULL DEFAULT '0',`c` varchar(500) NOT NULL DEFAULT '',`pad` char(60) NOT NULL DEFAULT '',`is_used` int(11) DEFAULT NULL,PRIMARY KEY (`id`),KEY `k_1` (`k`),KEY `idx_is_used` (`is_used`),KEY `idx_gmt_create` (`gmt_create`)
) ENGINE=InnoDB AUTO_INCREMENT=69313841 DEFAULT CHARSET=latin1
1 row in set (0.00 sec)

索引结构

index-recurse

[root@localhost mysql]# innodb_space -s ibdata1 -T test/sbtest1 -I PRIMARY index-recurse | more
ROOT NODE #3: 369 records, 5166 bytesNODE POINTER RECORD ≥ (id=43000569) → #9INTERNAL NODE #9: 1050 records, 14700 bytesNODE POINTER RECORD ≥ (id=43000569) → #7LEAF NODE #7: 68 records, 15028 bytesRECORD: (id=43000569) → (gmt_create="184616470-38-96 24:80:37", gmt_modified="-891360229-11-75 00:49:77", k=-1271582413, c="73586-15688153734-79729593694-96509299839-83724898275-8671183
3539-78981337422-35049690573-51724173961-87474696253989966", pad="21624-36689827414-04092488557-09587706818-65008859162 \x80\x00\x00\x00w\x00", is_used=-2147477504)RECORD: (id=43000570) → (gmt_create="184616470-38-96 24:80:37", gmt_modified="-891360231-94-84 49:64:33", k=-1271451079, c="70079-70972780322-70018558993-71769650003-09270326047-3241701
2031-10768856803-14235120402-93989080412-18690312264047768", pad="26683-45880822084-77922711547-29057964468-76514263618 \x80\x00\x00\x00w\x00", is_used=-2147475456)RECORD: (id=43000571) → (gmt_create="184616470-38-96 24:80:37", gmt_modified="-891360229-49-27 20:33:85", k=-1288227272, c="27441-24903985029-56844662308-79012577859-40518387141-6058841
9212-24399130405-42612257832-29494881732-71506024440268430", pad="35807-96849339132-53943793991-69741192222-48634174017 \x80\x00\x00\x00w\x00", is_used=-2080364544)
...

index-record-offsets

[root@localhost mysql]# innodb_space -s ibdata1 -T test/sbtest1 -I PRIMARY index-record-offsets | more
page_offset         record_offset
7                   127
7                   348
7                   569
7                   790
7                   1011
7                   1232
7                   1453
7                   1674
7                   1895
7                   2116
...

index-level-summary

[root@localhost mysql]# innodb_space -s ibdata1 -T test/sbtest1 -I PRIMARY -l 0 index-level-summary | more
page    index   level   data    free    records min_key
7       74      0       15028   1192    68      id=43000569
8       74      0       15028   1192    68      id=43000637
10      74      0       15028   1192    68      id=43000705
11      74      0       15028   1192    68      id=43000773
12      74      0       15028   1192    68      id=43000841
13      74      0       15028   1192    68      id=43000909
14      74      0       15028   1192    68      id=43000977
15      74      0       15028   1192    68      id=43001045
16      74      0       15028   1192    68      id=43001113
17      74      0       15028   1192    68      id=43001181
18      74      0       15028   1192    68      id=43001249
19      74      0       15028   1192    68      id=43001317
...

记录结构

record-dump

[root@localhost mysql]# innodb_space -s ibdata1 -T test/sbtest1 -p 7 -R 128 record-dump
Record at offset 128Header:Next record offset  : -8702Heap number         : 512Type                : conventionalDeleted             : falseLength              : 7System fields:Transaction ID: 38377940Roll Pointer:Undo Log: page 112897, offset 4249Rollback Segment ID: 0Insert: falseKey fields:id: 270727424Non-key fields:gmt_create: "222619031-78-45 93:12:68"gmt_modified: "-370929284-39-30 89:87:40"k: -1255066825c: ""pad: "3586-15688153734-79729593694-96509299839-83724898275-8671183"is_used: -1288359111

记录历史

record-history

[root@localhost mysql]# innodb_space -s ibdata1 -T test/sbtest1 -p 7 -R 128 record-history
Transaction   Type                Undo record
[root@localhost mysql]# 

其他拓展

space-lists

[root@localhost mysql]# innodb_space -s ibdata1 space-lists
name                length      f_page      f_offset    l_page      l_offset
free                619         32768       6918        0           438
free_frag           5           0           398         0           318
full_frag           2           0           158         0           278
full_inodes         1           2           38          2           38
free_inodes         2           322         38          243         38
[root@localhost mysql]#

space-list-iterate

[root@localhost mysql]# innodb_space -s ibdata1 space-list-iterate -L free_frag
start_page  page_used_bitmap
384         #############........###################################........
16384       ##..............................................................
32768       ##..............................................................
320         ####################################################.######.##..
256         #############################.##.#..##...###..#.######..####.##.
[root@localhost mysql]#

space-inodes-summary

[root@localhost mysql]# innodb_space -s ibdata1 space-inodes-summary
INODE fseg_id=1, pages=3552, frag=32, full=47, not_full=8, free=0
INODE fseg_id=2, pages=1, frag=1, full=0, not_full=0, free=0
INODE fseg_id=3, pages=1, frag=1, full=0, not_full=0, free=0
INODE fseg_id=4, pages=1, frag=1, full=0, not_full=0, free=0
INODE fseg_id=5, pages=1, frag=1, full=0, not_full=0, free=0
INODE fseg_id=6, pages=0, frag=0, full=0, not_full=0, free=0
INODE fseg_id=7, pages=1, frag=1, full=0, not_full=0, free=0
INODE fseg_id=8, pages=0, frag=0, full=0, not_full=0, free=0
INODE fseg_id=9, pages=1, frag=1, full=0, not_full=0, free=0
INODE fseg_id=10, pages=0, frag=0, full=0, not_full=0, free=0
INODE fseg_id=11, pages=1, frag=1, full=0, not_full=0, free=0
INODE fseg_id=12, pages=0, frag=0, full=0, not_full=0, free=0
INODE fseg_id=13, pages=1, frag=1, full=0, not_full=0, free=0
INODE fseg_id=14, pages=0, frag=0, full=0, not_full=0, free=0
INODE fseg_id=15, pages=160, frag=32, full=2, not_full=0, free=0
INODE fseg_id=16, pages=1, frag=1, full=0, not_full=0, free=0
...

undo-history-summary

[root@izhp3j8nb7nyq2g923r9fvz mysql]# innodb_space -s ibdata1 undo-history-summary
Page    Offset  Transaction   Type                Table
345     2452    162569        delete
345     2512    162600        delete
345     2598    162601        update_deleted
345     2675    162569        update_existing     SYS_TABLESPACES
345     2716    162569        update_existing     SYS_DATAFILES
345     2763    162600        update_existing     SYS_TABLESPACES
345     2817    162600        update_existing     SYS_DATAFILES
347     2859    162595        delete              mysql/innodb_table_stats
284     2925    162581        delete              mysql/innodb_index_stats
284     3020    162581        delete              mysql/innodb_index_stats
284     3115    162581        delete              mysql/innodb_index_stats
284     3194    162597        delete              mysql/innodb_index_stats
284     3303    162597        delete              mysql/innodb_index_stats
284     3412    162597        delete              mysql/innodb_index_stats
284     3521    162597        delete              mysql/innodb_index_stats
284     3614    162589        delete              mysql/innodb_index_stats
284     3717    162589        delete              mysql/innodb_index_stats
284     3820    162589        delete              mysql/innodb_index_stats
284     3923    162589        delete              mysql/innodb_index_stats
284     4010    162581        delete              mysql/innodb_index_stats
284     4097    162581        delete              mysql/innodb_index_stats
284     4184    162581        delete              mysql/innodb_index_stats
284     4271    162581        delete              mysql/innodb_index_stats
312     3626    162568        delete
312     3679    162568        delete
312     3740    162568        delete
...

undo-record-dump

Print a detailed description of an undo record and the data it contains:

[root@localhost mysql]# innodb_space -s ibdata1 -p page -R offset undo-record-dump
/usr/local/share/gems/gems/innodb_ruby-0.9.15/bin/innodb_space:1582:in `undo_record_dump': undefined method `root' for nil:NilClass (NoMethodError)from /usr/local/share/gems/gems/innodb_ruby-0.9.15/bin/innodb_space:2055:in `<top (required)>'from /usr/local/bin/innodb_space:23:in `load'from /usr/local/bin/innodb_space:23:in `<main>'

引用ruby库

$ irb -r innodb
> sys = Innodb::System.new("ibdata1")
> idx = sys.index_by_name("sakila/film", "PRIMARY")
> rec = idx.binary_search([1])

参考

https://github.com/jeremycole/innodb_ruby/wiki
开发原理
https://blog.jcole.us/2013/01/10/btree-index-structures-in-innodb/

解读InnoDB页面--索引结构相关推荐

  1. 【mysql innodb索引结构B+树】

    [mysql innodb索引结构B+树] 为什么Mysql中Innodb的索引结构采取B+树? B树 B树的两个明显特点 树内的每个节点都存储数据 叶子节点之间无指针相邻 B+树 B+树的两个明显特 ...

  2. MySQL怎么运行的系列(四)Innodb索引结构和方案

    本系列文章目录 展开/收起 MySQL怎么运行的系列(一)mysql体系结构和存储引擎 MySQL怎么运行的系列(二)Innodb缓冲池 buffer pool 和 改良版LRU算法 Mysql系列( ...

  3. mysql默认存储引擎的索引结构是_InnoDB引擎的索引和存储结构

    在Oracle 和SQL Server等数据库中只有一种存储引擎,所有数据存储管理机制都是一样的. 而MySql数据库提供了多种存储引擎.用户可以根据不同的需求为数据表选择不同的存储引擎,用户也可以根 ...

  4. mysql索引结构原理、性能分析与优化

    摘要: 第一部分:基础知识 第二部分:MYISAM和INNODB索引结构 1.简单介绍B-tree B+ tree树 2.MyisAM索引结构 3.Annode索引结构 4.MyisAM索引与Inno ...

  5. 深入理解MySQL(2):详谈索引结构

    MySQL 四.索引 4.1索引简介 MySQL官方对索引的定义为:索引(Index)是帮助MySQL高效获取数据的数据结构,所以说索引的本质是:数据结构 索引的目的在于提高查询效率,可以类比字典. ...

  6. 《MYSQL是怎样运行的》笔记|配置文件|系统变量|字符集|InnoDB存储结构|数据页结构|索引结构与使用|数据目录|表空间|连表原理|查询优化|BufferPool|事务|redo与undo|锁

    <MYSQL是怎样运行的>笔记 前记: 历时15天,笔记+看书.完成于2022.2.5. 本书是讲具体的数据库实现,而数据库系统概念见:https://blog.csdn.net/qq_4 ...

  7. 【转】2.3【MySQL】运行原理(三)InnoDB 逻辑存储结构

    MySQL的存储结构分为5级:表空间.段.簇.页.行. 1.表空间 TableSpace 上篇[MySQL]从InnoDB的内存结构.磁盘结构到update sql执行过程分析 在磁盘结构部分就说过了 ...

  8. mysql innodb 二级索引,mysql InnoDB index 主键采用聚簇索引,二级索引不采用聚簇索引...

    我的归纳: (1)InnoDB的主键采用聚簇索引存储,使用的是B+Tree作为索引结构,但是叶子节点存储的是索引值和数据本身(注意和MyISAM的不同). (2)InnoDB的二级索引不使用聚蔟索引, ...

  9. MySQL聚集索引详解_MySQL innodb 聚集索引的概念与使用教程

    聚集索引是指数据库表行中数据的物理顺序与键值的逻辑(索引)顺序相同.一个表只能有一个聚集索引,因为一个表的物理顺序只有一种情况,所以,对应的聚集索引只能有一个. 在MySQL中,InnoDB引擎表是( ...

  10. 解读mysql的索引和事务的正确姿势

    一.索引是做什么的? 很多时候,当你的应用程序进行SQL查询速度很慢时,应该想想是否可以建索引. 大多数MySQL索引(PRIMARY KEY.UNIQUE.INDEX和FULLTEXT)在B树中存储 ...

最新文章

  1. 算法-----数组-----移除特定元素
  2. 先给自己定个小目标,比如写个爬虫程序
  3. 新书发布《每天5分钟玩转Docker容器技术》
  4. 极大似然法估计与极大验后法估计
  5. MySQL高级 - 应用优化
  6. input ios问题
  7. pads layout 中 hatch和flood之区别
  8. defaultdict python_Python使用defaultdict读取文件各列的方法
  9. Html文件转换为Aspx文件后发现样式丢失或失效
  10. 阿里云马涛:什么是操作系统的云原生?
  11. 蓝牙耳机声音一顿一顿的_这次让世界听听我们的声音——声阔SoundcoreLiberty2Pro蓝牙耳机...
  12. 十字路口红绿灯plc程序_PLC编程-典型案例红绿灯控制
  13. mysql 字符串 索引优化_轻松优化MySQL-之索引优化1
  14. 怎么用jquery实现全选_经济薄弱,该怎么实现花园梦?用这些替代物降低养花成本...
  15. 摩尔庄园怎么显示全部服务器,摩尔庄园手游怎么看自己玩的什么服,服务器查看区别方法...
  16. XP盗版问题解决方案
  17. 《场景革命》读书笔记
  18. 金蝶迷你版所有数据引出excel没有反应,如何处理
  19. Java基础编程实现2-面向对象-类
  20. H5电玩城源码+玩法比较多+UI也特别好看+纯源码系列

热门文章

  1. 敏捷:什么是用户故事(User Story)
  2. i++,++i 作为参数
  3. eclipse 代码问题总结
  4. 使用maven给spring项目打可直接运行的jar包(配置文件内置外置的打法)
  5. PowerDesigner教程系列(二)概念数据模型
  6. UML中对关系的描述
  7. Python+Selenium练习篇之4-利用link text定位元素
  8. Jzoj5445【NOIP2017提高A组冲刺11.2】失格
  9. PHP中的的一个挺好用的函数 array_chunk
  10. Characteristics with cached values must be read-only