- ubuntu12.04环境下使用kvm ioctl接口实现最简单的虚拟机
- Ubuntu 通过无线网络安装Ubuntu Server启动系统后连接无线网络的方法
- 在Ubuntu上搭建网桥的方法
- ubuntu 虚拟机上网方式及相关配置详解
CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.
这篇CFSDN的博客文章获取 MySQL innodb B+tree 的高度的方法由作者收集整理,如果你对这篇文章有兴趣,记得点赞哟.
前言 。
MySQL 的 innodb 引擎之所以使用 B+tree 来存储索引,就是想尽量减少数据查询时磁盘 IO 次数。树的高度直接影响了查询的性能。一般树的高度在 3~4 层较为适宜。数据库分表的目的也是为了控制树的高度。那么如何获取树的高度呢?下面使用一个示例来说明如何获取树的高度.
示例数据准备 。
建表语句如下:
1
2
3
4
5
6
7
8
|
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万条数据。数据如下:
1
2
3
4
5
6
7
8
9
10
|
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 。
1
2
3
4
5
6
7
8
9
|
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 。
再读取页的大小 。
1
2
3
4
5
6
7
|
mysql> show
global
variables
like
'innodb_page_size'
;
+
------------------+-------+
| Variable_name | Value |
+
------------------+-------+
| innodb_page_size | 16384 |
+
------------------+-------+
1 row
in
set
(0.00 sec)
|
最后读取索引树的高度 。
1
2
3
|
$ 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 。
我们在用这个方式查看下其他两个索引的高度.
1
2
3
4
5
6
|
$ 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 的资料请关注我其它相关文章! 。
原文链接:https://www.bo56.com/%e5%a6%82%e4%bd%95%e8%8e%b7%e5%8f%96-mysql-innodb-%e7%9a%84-btree-%e7%9a%84%e9%ab%98%e5%ba%a6/ 。
最后此篇关于获取 MySQL innodb B+tree 的高度的方法的文章就讲到这里了,如果你想了解更多关于获取 MySQL innodb B+tree 的高度的方法的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
我需要您在以下方面提供帮助。近一个月来,我一直在阅读有关任务和异步的内容。 我想尝试在一个简单的 wep api 项目中实现我新获得的知识。我有以下方法,并且它们都按预期工作: public Htt
我的可执行 jar 中有一个模板文件 (.xls)。不需要在运行时我需要为这个文件创建 100 多个副本(稍后将唯一地附加)。用于获取 jar 文件中的资源 (template.xls)。我正在使用
我在查看网站的模型代码时对原型(prototype)有疑问。我知道这对 Javascript 中的继承很有用。 在这个例子中... define([], function () { "use
影响我性能的前三项操作是: 获取滚动条 获取偏移高度 Ext.getStyle 为了解释我的应用程序中发生了什么:我有一个网格,其中有一列在每个单元格中呈现网格。当我几乎对网格的内容做任何事情时,它运
我正在使用以下函数来获取 URL 参数。 function gup(name, url) { name = name.replace(/[\[]/, '\\\[').replace(/[\]]/,
我最近一直在使用 sysctl 来做很多事情,现在我使用 HW_MACHINE_ARCH 变量。我正在使用以下代码。请注意,当我尝试获取其他变量 HW_MACHINE 时,此代码可以完美运行。我还认为
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 关闭 9 年前。 要求提供代码的问题必须表现出对所解决问题的最低限度的理解。包括尝试过的解决方案、为什么
由于使用 main-bower-files 作为使用 Gulp 的编译任务的一部分,我无法使用 node_modules 中的 webpack 来require 模块code> dir 因为我会弄乱当
关闭。这个问题需要更多focused .它目前不接受答案。 想改进这个问题吗? 更新问题,使其只关注一个问题 editing this post . 关闭 5 年前。 Improve this qu
我使用 Gridlayout 在一行中放置 4 个元素。首先,我有一个 JPanel,一切正常。对于行数变大并且我必须能够向下滚动的情况,我对其进行了一些更改。现在我的 JPanel 上添加了一个 J
由于以下原因,我想将 VolumeId 的值保存在变量中: #!/usr/bin/env python import boto3 import json import argparse import
我正在将 MSAL 版本 1.x 更新为 MSAL-browser 的 Angular 。所以我正在尝试从版本 1.x 迁移到 2.X.I 能够成功替换代码并且工作正常。但是我遇到了 acquireT
我知道有很多关于此的问题,例如 Getting daily averages with pandas和 How get monthly mean in pandas using groupby但我遇到
This is the query string that I am receiving in URL. Output url: /demo/analysis/test?startDate=Sat+
我正在尝试使用 javascript 中的以下代码访问 Geoserver 层 var gkvrtWmsSource =new ol.source.ImageWMS({ u
API 需要一个包含授权代码的 header 。这就是我到目前为止所拥有的: var fullUrl = 'https://api.ecobee.com/1/thermostat?json=\{"s
如何获取文件中的最后一个字符,如果是某个字符,则删除它而不将整个文件加载到内存中? 这就是我目前所拥有的。 using (var fileStream = new FileStream("file.t
我是这个社区的新手,想出了我的第一个问题。 我正在使用 JSP,我成功地创建了 JSP-Sites,它正在使用jsp:setParameter 和 jsp:getParameter 具有单个字符串。
在回答 StoreStore reordering happens when compiling C++ for x86 @Peter Cordes 写过 For Acquire/Release se
我有一个函数,我们将其命名为 X1,它返回变量 Y。该函数在操作 .on("focusout", X1) 中使用。如何获取变量Y?执行.on后X1的结果? 最佳答案 您可以更改 Y 的范围以使其位于函
我是一名优秀的程序员,十分优秀!