iis服务器助手广告广告
返回顶部
首页 > 资讯 > 数据库 >获取 MySQL innodb B+tree 的高度的方法
  • 740
分享到

获取 MySQL innodb B+tree 的高度的方法

MySQLinnodbinnodbB+treeB+tree高度 2022-05-11 10:05:18 740人浏览 独家记忆
摘要

前言 Mysql 的 innodb 引擎之所以使用 B+tree 来存储索引,就是想尽量减少数据查询时磁盘 io 次数。树的高度直接影响了查询的性能。一般树的高度在 3~4 层较为适宜。数据库分表的目的也是为了控制树

前言

Mysql 的 innodb 引擎之所以使用 B+tree 来存储索引,就是想尽量减少数据查询时磁盘 io 次数。树的高度直接影响了查询的性能。一般树的高度在 3~4 层较为适宜。数据库分表的目的也是为了控制树的高度。那么如何获取树的高度呢?下面使用一个示例来说明如何获取树的高度。

示例数据准备

建表语句如下:


CREATE TABLE `user` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(100) CHARACTER SET latin1 DEFAULT NULL,
  `age` int(11) DEFAULT NULL,
  PRIMARY KEY (`id`),
  KEY `name` (`name`),
  KEY `age` (`age`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8

表中插入100万条数据。数据如下:


mysql> select * from user limit 2\G
*************************** 1. row ***************************
  id: 110000
name: ab
 age: 100
*************************** 2. row ***************************
  id: 110001
name: ab
 age: 100
2 rows in set (0.00 sec)

通过查询相关数据表获取树的高度

以 Mysql5.6 版本为例说明如何获取树的高度。

首先获取 page_no


mysql> 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 b.name='test/user';
+-----------+---------+----------+------+-------+---------+
| name      | name    | index_id | type | space | PAGE_NO |
+-----------+---------+----------+------+-------+---------+
| test/user | PRIMARY |       22 |    3 |     6 |       3 |
| test/user | name    |       23 |    0 |     6 |       4 |
| test/user | age     |       24 |    0 |     6 |       5 |
+-----------+---------+----------+------+-------+---------+
3 rows in set (0.00 sec)

page_no 是索引树中Root页的序列号。其它各项的含义可以参照:
https://dev.mysql.com/doc/refman/5.6/en/innodb-sys-indexes-table.html

再读取页的大小


mysql> show global variables like 'innodb_page_size';
+------------------+-------+
| Variable_name    | Value |
+------------------+-------+
| innodb_page_size | 16384 |
+------------------+-------+
1 row in set (0.00 sec) 

最后读取索引树的高度


$ hexdump -s 49216 -n 10 ./user.ibd
000c040 0200 0000 0000 0000 1600
000c04a

可以发现 PAGE_LEVEL 为 0200,表示这棵二级索引树的高度为 3。后面的 1600 是索引的 index_id 值。十六进制的 16 转换为十进制数字是 22。这个 22 正好就是上面主键的 index_id。
上面 hexdump 命令中 49216 是怎么算出来的?公式是 page_no * innodb_page_size + 64。
3*16384+64=49216

我们在用这个方式查看下其他两个索引的高度。


$ hexdump -s 65600 -n 10 ./user.ibd
0010040 0100 0000 0000 0000 1700
001004a
$ hexdump -s 81984 -n 10 ./user.ibd
0014040 0200 0000 0000 0000 1800
001404a

可见,name 索引的高度是 2,age 索引的高度是 3。

根据索引的结构估算

如果你没有数据库服务器的权限。自己也可以根据数据库索引结构进行估算树的高度。
根据 B+Tree 结构,非叶子节点存储的是索引数据,叶子节点存储的是每行的所有数据。
非叶子节点每个索引项的大小是,数据大小+指针大小。假设指针大小为 8 个字节。每页不会被占满,预留1/5的空隙。下面我们估算下 name 和 age 两个索引的高度。

name 索引高度估算

非叶子节点每页存放的索引项数量。每页大小是 16k。name 的值为 ab。占2个字节。每项数据大小是 2+8=10字节。每页能存放的索引项数量是 16384 * 0.8 / 10 = 1310 个。
叶子节点每页存放的索引数量。每页大小是 16k。每项数据大小是 4+2+8=14 个字节。没页能存放的索引数量是 16384 * 0.8 / 14 = 936 个。
两层能存放 1310*936=1226160 个数据记录。可见120万条记录以下,树的高度为2。

age 索引高度估算

非叶子节点每页存放的索引项数量。每页大小是 16k。age 的类型为 int。占4个字节。每项数据大小是 4+8=12字节。每页能存放的索引项数量是 16384 * 0.8 / 12 = 1092 个。
叶子节点每页存放的索引数量。每页大小是 16k。每项数据大小是 4+4+8=16 个字节。没页能存放的索引数量是 16384 * 0.8 / 16 = 819 个。
两层能存放 1092*819=894348 个数据记录。可见90万条记录以下,树的高度为2。100万条为 3 层。

其它工具

还有一个小工具可以查看。InnoDB 表空间可视化工具innodb_ruby

以上就是获取 MySQL innodb 的 B+tree 的高度的示例的详细内容,更多关于MySQL innodb 的 B+tree 的资料请关注自学编程网其它相关文章!

您可能感兴趣的文档:

--结束END--

本文标题: 获取 MySQL innodb B+tree 的高度的方法

本文链接: https://www.lsjlt.com/news/9870.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • mysql bigint长度获取的方法是什么
    在 MySQL 中,可以使用 bigint 数据类型来存储较大的整数。bigint 数据类型的长度为 8 字节,范围为 -92233...
    99+
    2024-04-09
    mysql
  • 微信小程序动态获取元素宽度高度的方法
    本文小编为大家详细介绍“微信小程序动态获取元素宽度高度的方法”,内容详细,步骤清晰,细节处理妥当,希望这篇“微信小程序动态获取元素宽度高度的方法”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。首先,这个接口会返回一...
    99+
    2023-06-26
  • Android获取文本的宽度和高度
    获取文本宽度 方法一:先绘制文本所在的矩形区域,再获取矩形区域的宽度 Rect rect = new Rect(); mPaint.getTextBounds(text,0,text.length(), rect); ...
    99+
    2023-10-03
    android Powered by 金山文档
  • Android 百度地图Sha1获取的方法
    Android 百度地图Sha1获取的方法场景一由于最近项目钟要用到定位功能因此肯定需要用到地图以及地位功能,相信大家也知道目前国内比较出名的地图像百度、高德、腾讯等这些还是用到比较多的,于是思考了一下决定还是用百度,相信老司机们都知道的哈...
    99+
    2023-05-31
    android 百度地图 sha1
  • AndroidApp获取屏幕旋转角度的方法
    本文实例为大家分享了Android App获取屏幕旋转角度的具体代码,供大家参考,具体内容如下 一、获取屏幕旋转角度的方法是:int rotation = mActivity.get...
    99+
    2024-04-02
  • C语言获取数组长度的方法
    c 语言获取数组长度有两种方法:使用 sizeof() 运算符:length = sizeof(arr) / sizeof(arr[0]);使用宏:#define array_lengt...
    99+
    2024-05-08
    c语言
  • mysql获取当前时间的方法
    这篇文章将为大家详细讲解有关mysql获取当前时间的方法,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。mysql获取当前时间的方法:可以通过执行【select now()...
    99+
    2024-04-02
  • mysql获取blob的方法是什么
    要从MySQL中获取BLOB字段的值,可以使用SELECT语句来检索数据。以下是一个简单的示例: SELECT blob_f...
    99+
    2024-04-09
    mysql
  • mysql获取表项字段的方法
    小编给大家分享一下mysql获取表项字段的方法,希望大家阅读完这篇文章后大所收获,下面让我们一起去探讨吧!mysql获取表项字段的方法:首先调用MySQL数据库中的某一数据库;然后在数据库中创建含有某些字段...
    99+
    2024-04-02
  • javascript获取数组长度的方法有哪些
    这篇文章主要介绍“javascript获取数组长度的方法有哪些”,在日常操作中,相信很多人在javascript获取数组长度的方法有哪些问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大...
    99+
    2024-04-02
  • MySQL Innodb恢复的方法教程
    这篇文章主要介绍“MySQL  Innodb恢复的方法教程”,在日常操作中,相信很多人在MySQL  Innodb恢复的方法教程问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方...
    99+
    2024-04-02
  • mysql获取行号的方法是什么
    在 MySQL 中,您可以使用 ROW_NUMBER() 函数来获取行号。以下是一个使用 ROW_NUMBER() 函数的示例查询:...
    99+
    2024-04-09
    mysql
  • javascript如何获取隐藏元素的高度
    这篇文章将为大家详细讲解有关javascript如何获取隐藏元素的高度,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。 获取方法:1、引入jqu...
    99+
    2024-04-02
  • C语言获取数组长度的几种方法
    C语言获取数组长度的几种方法有:1. 使用sizeof运算符:可以使用sizeof运算符来获取数组的长度。例如,对于一个整型数组arr,可以使用sizeof(arr) / sizeof(arr[0])来获取数组的长度。2. 使用strl...
    99+
    2023-08-11
    C语言
  • Android获取移动网络信号强度的方法
    目录判断有没有 SIM 卡获取信号强度判断有没有 SIM 卡 获取移动网络的信号,一定要判断是否插了 SIM 卡,没插卡肯定是没法获取的 public sta...
    99+
    2024-04-02
  • 使用python抓取B站数据的方法
    这篇文章给大家分享的是有关使用python抓取B站数据的方法的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。概述可以获取的数据包括:video-视频模块user-用户模块dynamic-动态模块这次用“Runnin...
    99+
    2023-06-15
  • MySql手动获取自增主键的方法
    小编给大家分享一下MySql手动获取自增主键的方法,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!mysql手动获取自增主键的方法...
    99+
    2024-04-02
  • mysql获取年月日的方法是什么
    在MySQL中,可以使用YEAR()、MONTH()和DAY()函数来分别获取日期的年、月和日。 例如,要获取特定日期的年份,可以使...
    99+
    2024-05-13
    mysql
  • python 获取cookie的方法
      在 Web应用程序中,用户访问网站时,通常会请求访问服务器上保存的一些用户信息(例如: Cookie),这些信息包含了用户的一些个人信息,比如:姓名、地址、密码等。对于用户来说,如果不需要这些信息,则可以不请求服务器上的这些数据,但是...
    99+
    2023-09-01
    服务器 前端 运维
  • mysql获取时间戳的方法是什么
    在MySQL中获取时间戳的方法是使用UNIX_TIMESTAMP()函数。UNIX_TIMESTAMP()函数返回当前日期时间的UN...
    99+
    2024-04-09
    mysql
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作