MySQL索引之B+树
MySQL索引大都存储在B+树中,除此还有R树和hash索引。B+树的基础还是B树。
B树由2部分组成,节点和索引。下面将构建一个B树,每个节点存2个数据,每个节点有前,中,后三个索引。插入数字的顺序为1,2,3,4,5,6。
每个节点存储2个数据,插入3时将进行分裂操作。节点一分为2,并在中间增加一个新的节点。新增节点将1,2,3中间的数字2进行存储。
数字2的前后有2个索引,左边的索引指向的节点中的数字都比2小,右边索引中指向的节点中的数字都比2大。
插入5时,节点1分为2,并将3,4,5中间的数字4上移至上级节点存储。
下面尝试插入顺序为8,5,1,7,3,12,9,6的B树生成顺序。
插入数字8
插入数字5
插入数字1
插入数字7
插入数字3
插入数字12
插入数字9
插入数字6
B+树是在B树的基础上建立的,B+树数据将只会存储在叶子节点上,非叶子节点将只存在索引。由于B+树的非叶子节点只存储索引,则同样大小的内存B+树存放的索引节点较多,树的高度也会较小,查取方便。
下面尝试插入顺序为8,5,1,7,3,12,9,6的B+树生成顺序。可以将这些数字对应于MySQL数据库表中的主键,数字后面所存储的才是具体的数据。
插入数字8
插入数字5
插入数字1,注意节点5只是索引上移了,具体的存储还是在叶子节点中,这就不同于B树了。
插入数字7
插入数字3
插入数字12.要新增索引节点8(7<8<12),还会导致索引节点5的上移(3<5<8)。
插入数字9
插入数字6.最上层的索引节点是5,6大于5,只能位于索引5的右侧,就不能和叶子节点中的5放在一起,会导致索引7上移。
MySQL中索引和数据是分成不同的文件存储的,对应于B+树,我们可以理解为非叶子节点是存储在一个文件中的,叶子节点是存储在一个文件中的。
查看MySQL安装目录下的data目录,下面可以查看到已经创建的数据表的存储文件。
MyISAM类型的表有以下的文件:
.MYD:数据文件
.MYI:索引文件
.frm:表描述文件
InnoDB类型的表有以下的文件:
.frm:表描述文件
.idb:单独一个表的数据内容以及索引内容
InnoDB的存储又分为共享表空间和独立表空间。
在my.ini中设置:innodb_file_per_table=1 为使用独占表空间
innodb_file_per_table=0 为使用共享表空间。
共享表空间: 某一个数据库的所有的表数据,索引文件全部放在一个文件中,默认这个共享表空间的文件路径在data目录下。 默认的文件名为:ibdata1 初始化为10M。
独占表空间: 每一个表都将会生成以独立的文件方式来进行存储,每一个表都有一个.frm表描述文件,还有一个.ibd文件。 其中这个文件包括了单独一个表的数据内容以及索引内容,默认情况下它的存储位置也是在表的位置之中。
共享表空间数据和文件放在一起方便管理,独占表空间将拥有更高的效率。
InnoDB日志文件(ib_logfile1和ib_logfile2),用户崩溃恢复和备份。
在使用独立表空间的情况下,如果不慎使得innodb存储引擎的元数据文件ibdata损坏,我们还可以挽救宝贵的数据.因为在innodb使用独立表空间的情况下,ibdata文件会记录每个innodb表的id,只要使得ibd中的表id和ibdata文件中记录的表id相同,就能够打开表,读取到数据.
可参见:http://blog.csdn.net/ylqmf/article/details/7229562
MySQL索引之B+树的更多相关文章
- 为什么MySQL索引使用B+树
为什么MySQL索引使用B+树 聚簇索引与非聚簇索引 不同的存储引擎,数据文件和索引文件位置是不同的,但是都是在磁盘上而不是内存上,根据索引文件.数据文件是否放在一起而有了分类: 聚簇索引:数据文件和 ...
- 聊聊Mysql索引和redis跳表
摘要 面试时,交流有关mysql索引问题时,发现有些人能够涛涛不绝的说出B+树和B树,平衡二叉树的区别,却说不出B+树和hash索引的区别.这种一看就知道是死记硬背,没有理解索引的本质.本文旨在剖析这 ...
- [转] MySQL索引原理
MySQL索引原理 B+树索引是B+树在数据库中的一种实现,是最常见也是数据库中使用最为频繁的一种索引.B+树中的B代表平衡(balance),而不是二叉(binary),因为B+树是从最早的平衡二叉 ...
- 浅谈Mysql索引
文章原创于公众号:程序猿周先森.本平台不定时更新,喜欢我的文章,欢迎关注我的微信公众号. 我们都知道,数据库索引可以帮助我们更加快速的找出符合的数据,但是如果不使用索引,Mysql则会从第一条开始查询 ...
- 聊聊Mysql索引和redis跳表 ---redis的有序集合zset数据结构底层采用了跳表原理 时间复杂度O(logn)(阿里)
redis使用跳表不用B+数的原因是:redis是内存数据库,而B+树纯粹是为了mysql这种IO数据库准备的.B+树的每个节点的数量都是一个mysql分区页的大小(阿里面试) 还有个几个姊妹篇:介绍 ...
- 从MongoDB及mysql 谈B/B+树
一 B树的由来 B树指的是一类树,包括B-树,B+树,B*树等,是一种自平衡的搜索树,它类似普通的平衡二叉树,不同的一点是B树允许每个节点有更多的子节点.B树是专门为外部存储器设计的,如磁盘,它对于读 ...
- mysql索引原理深度解析
mysql索引原理深度解析 一.总结 一句话总结: mysql索引是b+树,因为b+树在范围查找.节点查找等方面优化 hash索引,完全平衡二叉树,b树等 1.数据库中最常见的慢查询优化方式是什么? ...
- MySQL索引由浅入深
索引是SQL优化中最重要的手段之一,本文从基础到原理,带你深度掌握索引. 一.索引基础 1.什么是索引 MySQL官方对索引的定义为:索引(Index)是帮助MySQL高效获取数据的数据结构,索引对于 ...
- B+树|MYSQL索引使用原则
MySQL一直了解得都不多,之前写sql准备提交生产环境之前的时候,老员工帮我检查了下sql,让修改了一下存储引擎,当时我使用的是Myisam,后面改成InnoDB了.为什么要改成这样,之前都没有听过 ...
随机推荐
- B. OR in Matrix
B. OR in Matrix time limit per test 1 second memory limit per test 256 megabytes input standard inpu ...
- JAVA爬虫实践(实践三:爬虫框架webMagic和csdnBlog爬虫)
WebMagic WebMagic是一个简单灵活的Java爬虫框架.基于WebMagic,你可以快速开发出一个高效.易维护的爬虫. 采用HttpClient可以实现定向的爬虫,也可以自己编写算法逻辑来 ...
- [国嵌攻略][060][LCD工作原理解析]
LCD硬件体系 1.LCD液晶屏 液晶属于一种有机化合物,分子形状为长棒状,在不同的电流作用下,分子会有规律旋转,这样对光线产生一定的控制形成一个像素,而很多像素右可以构成完整的图像. LCD是Liq ...
- html日历(1)
<html> <head> <link rel="stylesheet" type="text/css" href="S ...
- Robots.txt - 禁止爬虫
robots.txt用于禁止网络爬虫访问网站指定目录.robots.txt的格式采用面向行的语法:空行.注释行(以#打头).规则行.规则行的格式为:Field: value.常见的规则行:User-A ...
- Red Hat
同义词 REDHAT一般指Red Hat Red Hat(红帽)公司(NYSE:RHT)是一家开源解决方案供应商,也是标准普尔500指数成员.总部位于美国北卡罗来纳州的罗利市,截止2015年3月3日, ...
- ip 百度地图 php
已知一个IP $ipname=api_hits($DT_IP); -------------- //apifunction getAddressComponent($ak, $longitude, $ ...
- ffmpeg中avframe的YUV格式数据到OpenCV中Mat的BGR格式转换
ffmpeg实现音视频编解码是非常常用的工具,视频解码出来的raw数据是yuv格式,用来进行后续的图像处理一般是RGB格式的.所以需要从yuv到rgb或者bgr的转换,ffmpeg提供了相应的转换AP ...
- @RequestMapping 相关 spring
* * @param request HttpServletRequest * @param delList 削除Idエスト * @return 削除結果 * @th ...
- h5开发安卓软键盘遮挡解决方案
//处理input focus时被键盘遮挡问题 inputFocus:function(){ if(/Android [4-6]/.test(navigator.appVersion)) { wind ...