mysqlb+树度如何看开了哪些b

考虑表结构如下:
create table testzh(id int &primary key auto_increment ,id2 int,id3 int);
插入数据:
delimiter //
&create procedure ins3()
& & &begin
& & &set i=0;
& & &while i&10000 do
& & & & &insert into testzh(id2,id3) values(FLOOR((RAND()*100000)),FLOOR((RAND()*100000)));
& & & & &set i=i+1;
这里仅仅考虑聚合索引的B+数结构。
首先我们要考虑2个因素:
1、分支节点如何存储一行数据
2、叶子结点如何存储一行数据
位了找到这个问题我们必须要找到哪些块是叶子结点,哪些块是非叶子结点,这里使用自己写的一个程序
找到详细参考最后的代码
(http://blog.itpub.net/7728585/viewspace-2128817/)
[root@testmy test]# ./t1 &testzh.ibd
file size is 442368
Block id is 3:Index page no is 552 : B+ Tree Level is 1
Block id is 4:Index page no is 552 : B+ Tree Level is 0
Block id is 5:Index page no is 552 : B+ Tree Level is 0
Block id is 6:Index page no is 552 : B+ Tree Level is 0
Block id is 7:Index page no is 552 : B+ Tree Level is 0
Block id is 8:Index page no is 552 : B+ Tree Level is 0
Block id is 9:Index page no is 552 : B+ Tree Level is 0
可以看到在这个文件中block_id = 3的是非叶子结点
其他的块是叶子结点。
那我们来研究第一个问题
1、分支节点如何存储一行数据
其实这个问题答案就是
6字节固定开销+4字节(int数据类型4字节)+4字节(指向叶子结点的指针开销)
我们知道每个数据库块的前120直接是管理固定开销如:
FILE HEADER,INDEX HEADER等
在块尾部也有8字节的固定开销
那么我们从offset 120开始向后面数14个字节,这里也要使用我自己写的工具
bcview 方便查看
./bcview testzh.ibd 16 120 14
current block:--Offset:00120--cnt bytes:14--data is:e0004
分析一下:
固定开销(6字节)
00 & &nullable field bitmap (?)
10 & &info flags+number of records owned
0011 &order+ record type (01 0001)
000e & & 下一个偏移量
--可变开销(实际数据4字节)
(实际主键数据1其中8是符号位)
--固定开销(4字节)
(叶子结点block指针)
我们可以看到这是非叶子结点存储数据的格式如此,除了4字节的主键外,这里包含了10字节的额外开销。
2、叶子结点如何存储一行数据
接下来我们来看一下这个表的每一行数据是如何存放的,二进制如下:
./bcview testzh.ibd 16 120 31
current block:--Offset:00120--cnt bytes:31--data is:f004dcd
00 nullable field bitmap(?)
00 info flags+number of records owned
0010 order+record type
001f 下一个偏移量
(实际主键id数据1其中8是符号位)
5 &transaction id&
cd roll pointer
800046cd (实际数据id2:18125 8是符号位)
(实际数据id2:1667 &8是符号位)
实际上就是31个字节
那么我们很容易计算出来如果满存储行大约(16*(块头块尾部))/31 = 524 行数据。当然实际上存储达不到这个值受到
B+树分裂行为以及填充因子等限制实际上到不了这个值,我这里去大约500行数据
好了对于这张表这里我们可以实际大约计算一下理论值,实际值将略小:
一层B+树 & & 最大16K空间 & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & 约500行数据
二层B+树 & & 最大约18M空间((16* * 16/1024 ) & & & & & & & & & & & & & & & & & & & &&约58000行数据((16* *500)
三层B+树 & & 最大约21000M空间(power((16*,2) * 16/1024) & & & & & & & & & & & 约行数据(power((16*,2) * 500)
四层B+树 & & 最大约M空间(power((16*,3) * 16/1024) & & & & & & & & &约行数据(power((16*,3) * 500)
但是要注意这里最大空间受到主键选择影响很大,如果不是int为主键那么其非叶子结点一行数据将不会是14字节如果是long类型将是18字节,那么最大空间
将不会达到这么大,而行数更是受到实际一行数据大小限制,这里只是以文章开头建立的表为列子。
作者微信:
& & & & & & & &
&&&回复&&&:
北京盛拓优讯信息技术有限公司. 版权所有 京ICP备号 北京市公安局海淀分局网监中心备案编号:10
广播电视节目制作经营许可证(京) 字第1234号 中国互联网协会会员mysql中的b-tree实现在哪个源码文件中?_百度知道
mysql中的b-tree实现在哪个源码文件中?
想学习一下b-tree,想看看mysql是怎么实现的,但是不知道是哪个源码文件,请大侠不吝赐教!...
想学习一下b-tree,想看看mysql是怎么实现的,但是不知道是哪个源码文件,请大侠不吝赐教!
答题抽奖
首次认真答题后
即可获得3次抽奖机会,100%中奖。
如果查找数据29,那么首先会把硬盘块由磁盘加载到内存此时发生一次IO,在内存中用二分查找确定29在17和35之间,锁定磁盘块1的P2指针,内存时间因为非常短(相比磁盘的IO)可以忽略不计,通过磁盘块1的P2指针的磁盘地址把磁盘块3由磁盘加载到内存,发生第二次IO,29在26和30之间,锁定磁盘块3的P2指针,通过指针加载磁盘块8到内存,发生第三次IO,同时内存中做二分查找找到29,结束查询,总计三次IO。真实的情况是,3层的b+树可以表示上百万的数据,如果上百万的数据查找只需要三次IO,性能提高将是巨大的,如果没有索引,每个数据项都要发生一次IO,那么总共需要百万次的IO,显然成本非常非常高。
擅长:暂未定制
storage/innobase/include/dict0mem.h /** Data structure for an index.
Most fields will be
initialized to 0, NULL or FALSE in dict_mem_index_create(). */struct dict_index_t
为你推荐:
其他类似问题
个人、企业类
违法有害信息,请在下方选择后提交
色情、暴力
我们会通过消息、邮箱等方式尽快将举报结果通知您。配合上一篇文章理解:
如上图,是一颗b+树,关于b+树的定义可以参见B+树,这里只说一些重点,浅蓝色的块我们称之为一个磁盘块,可以看到每个磁盘块包含几个数据项(深蓝色所示)和指针(黄色所示),如磁盘块1包含数据项17和35,包含指针P1、P2、P3,P1表示小于17的磁盘块,P2表示在17和35之间的磁盘块,P3表示大于35的磁盘块。真实的数据存在于叶子节点即3、5、9、10、13、15、28、29、36、60、75、79、90、99。非叶子节点只不存储真实的数据,只存储指引搜索方向的数据项,如17、35并不真实存在于数据表中。
b+树的查找过程
如图所示,如果要查找数据项29,那么首先会把磁盘块1由磁盘加载到内存,此时发生一次IO,在内存中用二分查找确定29在17和35之间,锁定磁盘块1的P2指针,内存时间因为非常短(相比磁盘的IO)可以忽略不计,通过磁盘块1的P2指针的磁盘地址把磁盘块3由磁盘加载到内存,发生第二次IO,29在26和30之间,锁定磁盘块3的P2指针,通过指针加载磁盘块8到内存,发生第三次IO,同时内存中做二分查找找到29,结束查询,总计三次IO。真实的情况是,3层的b+树可以表示上百万的数据,如果上百万的数据查找只需要三次IO,性能提高将是巨大的,如果没有索引,每个数据项都要发生一次IO,那么总共需要百万次的IO,显然成本非常非常高。
1、通过上面的分析,我们知道IO次数取决于b+数的高度h,假设当前数据表的数据为N,每个磁盘块的数据项的数量是m,则有h=㏒(m+1)N,当数据量N一定的情况下,m越大,h越小;而m = 磁盘块的大小 / 数据项的大小,磁盘块的大小也就是一个数据页的大小,是固定的,如果数据项占的空间越小,数据项的数量越多,树的高度越低。这就是为什么每个数据项,即索引字段要尽量的小,比如int占4字节,要比bigint8字节少一半。这也是为什么b+树要求把真实的数据放到叶子节点而不是内层节点,一旦放到内层节点,磁盘块的数据项会大幅度下降,导致树增高。当数据项等于1时将会退化成线性表。
2、当b+树的数据项是复合的数据结构,比如(name,age,sex)的时候,b+数是按照从左到右的顺序来建立搜索树的,比如当(张三,20,F)这样的数据来检索的时候,b+树会优先比较name来确定下一步的所搜方向,如果name相同再依次比较age和sex,最后得到检索的数据;但当(20,F)这样的没有name的数据来的时候,b+树就不知道下一步该查哪个节点,因为建立搜索树的时候name就是第一个比较因子,必须要先根据name来搜索才能知道下一步去哪里查询。比如当(张三,F)这样的数据来检索时,b+树可以用name来指定搜索方向,但下一个字段age的缺失,所以只能把名字等于张三的数据都找到,然后再匹配性别是F的数据了, 这个是非常重要的性质,即索引的最左匹配特性。
详解B+tree以及mysql的索引原理 一
最近在学mysq的索引,网上查了很多资料但都没有很好理解的,现在先讲讲b+tree
动态查找树主要有:二叉查找树(Binary Search Tree),平衡二叉查找树(Balanced...
理解mysql索引背后的数据结构B~Tree(B-Tree/B+Tree)
B-Tree在不同的文献中的定义略显不同,所以在我初学B-Tree的时候非常困惑,知乎的一篇回答解答了我的困惑为什么 B-tree 在不同著作中度的定义有一定差别? - oldsharp的回答 - 知...
高性能Mysql:B-TREE和B+-TREE
高性能Mysql:B-TREE和B+-TREE一、索引简介数据库中,索引对于查询来说至关重要。它就像书籍里的目录一样,能在磁盘页面中迅速找到所需要的记录,能够将查询性能提高好几个数量级。所以索引是应对...
MySQL系列之八:中间件
较为活跃,Atlas 是由 360 Web平台部基础架构团队开发维护的一个基于 MySQL 协议的数据中间层项目。它是在mysql-proxy 0.8.2版本的基础上,对其进...
MySQL系列教程(一)
摘要MySQL的最初的核心思想,主要是开源、简便易用。其开发可追溯至1985年,而第一个内部发行版本诞生,已经是1995年。到1998年,MySQL已经可以支持10中操作系统了,其中就包括win平台。...
MySQL 系列第一天
MySQL 入门第一天这篇文章是黑马程序员 MySQL 教程的笔记,好好学习哦。
和 MySQL 数据库的交互
客户端单向连接认证:连接服务器,认证身份。
MySQL 数据库属于 C/S 架构,所以开...
MySQL系列—MySQL程序介绍
MySQL版本中提供了几种类型的命令行运用程序,主要有以下几类:1、MySQL服务器和启动脚本
mysqld 是MySQL服务器主程序;
mysqld_safe、mysql.server 和 mysq...
MySQL中B+Tree索引原理
转自:http://blog.csdn.net/u/article/details/
B+树索引是B+树在数据库中的一种实现,是最常见也是数...
Mysql InnoDB B+Tree索引
1,InnoDB索引类型
2,B+Tree索引
Mysql B+Tree简述
什么是索引?(别回答是增加效率啥的!)一个索引是存储的表中一个特定列的值数据结构。索引是在表的列上创建。请记住记住这一点:索引是帮助快速检索数据的数据结构 。什么样的数据结构是索引?B树是索引中最流行...
没有更多推荐了,mysql如何根据条件从A表中查询数据并插入B表_百度知道
mysql如何根据条件从A表中查询数据并插入B表
AB表中都有tt项,但顺序不同。需要查询两表中tt项数值相同的行,然后把A表中该行的kk数据插入B表。真诚求教A表ttkk1a2b3c4dB表ttkk2431需要填对应的kk值...
AB表中都有tt项,但顺序不同。需要查询两表中tt项数值相同的行,然后把A表中该行的kk数据插入B表。真诚求教A表tt
kk2431需要填对应的kk值
答题抽奖
首次认真答题后
即可获得3次抽奖机会,100%中奖。
来自电脑网络类芝麻团
采纳数:1203
获赞数:5264
参与团队:
使用连表更新update A,B set B.kk=A.kk where B.tt=A.tt更新后B表tt
为你推荐:
其他类似问题
个人、企业类
违法有害信息,请在下方选择后提交
色情、暴力
我们会通过消息、邮箱等方式尽快将举报结果通知您。MYSQL 查出A表中B表没有的数据 只需一条SQL语句_百度知道
MYSQL 查出A表中B表没有的数据 只需一条SQL语句
A表和B表的列都不同,只有A表中的name和B表的name列记录了相同的数据。如果要查出A表中name项不是B表中的name项,要怎么写SQL并且只用到一个select能够一条语句中只用到一次select么,...
A表和B表的列都不同,只有A表中的name和B表的name列记录了相同的数据。如果要查出A表中name项不是B表中的name项,要怎么写SQL并且只用到一个select能够一条语句中只用到一次select么,虽然select嵌套select确实可以达到
答题抽奖
首次认真答题后
即可获得3次抽奖机会,100%中奖。
Id_eGgPlaNt
来自电脑网络类芝麻团
Id_eGgPlaNt
采纳数:583
获赞数:959
参与团队:
select&name&from&A&where&name&not&in&(select&name&from&B)有问题再追问,望采纳。
能够一条语句中只用到一次select么,虽然select嵌套select确实可以达到
试试看select A.NAMEfrom A left join B ON A.NAME=B.NAMEWHERE B.NAME IS NULL
这个可以。再问:如果要追加一个条件,如:B表的xid=1,但A表中无此项,需要如何写?
select A.NAMEfrom A left join B ON A.NAME=B.NAMEWHERE B.NAME IS NULL and B.xid=1
加上“and B.xid=1”这个条件后什么都查不出来了
其实我不是太明白你的意思,试试这个select A.NAMEfrom A left join (select * from B where xid=1) B ON A.NAME=B.NAMEWHERE B.NAME IS NULL
这样写就ok了select A.NAMEfrom A left join B ON A.NAME=B.NAME and B.xid=1WHERE B.NAME IS NULL 万分感谢
来自知道合伙人认证行家
健身类行家
采纳数:145463
获赞数:632705
select&name&from&A&where&name&not&in&(select&name&from&B)select&name&from&A&where&not&exists(select&1&from&B&where&a.name=b.name)这两个你挑着用
去年叶落尘埃定
去年叶落尘埃定
采纳数:12
获赞数:34
擅长:暂未定制
select&distinct&name&from&&(select&name&from&B)&A;做一个嵌套查询 然后用 distinct 返回不同值
为你推荐:
其他类似问题
个人、企业类
违法有害信息,请在下方选择后提交
色情、暴力
我们会通过消息、邮箱等方式尽快将举报结果通知您。

我要回帖

更多关于 mysqlb-tree多少阶 的文章

 

随机推荐