浅析InnoDB引擎的索引和索引原理

什么是InnoDB的索引

InnoDB的索引就是一颗B+树。页是InnoDB引擎在内存和磁盘之间交换数据的基本单位,页的大小一般是16KB,页的大小可以在启动MySQL服务的时候通过更改innodb_page_size参数来设置。而InnoDB索引的节点就是页。

B+树的叶节点上的页是数据页,用于存放用户存入数据库中的一条一条的记录,而非叶子节点上的页是索引页,存放索引记录。一个节点存一个页,所以又有”索引就是数据,数据就是索引“之说。B+树同一层上的页又是以双向链表的形式来组织的。在数据页和索引页中,所有的记录中都会存储下一条记录相对页0字节处的偏移量,从而将同一个页中的所有记录连成一个单链表(可以看成是一个单链表)的形式。

所以从数据库的表中查找记录可以分为两步:

  1. 定位到记录所在的页
  2. 定位到页中的具体记录

快速定位到页中的记录

数据页的大致结构:

在数据页中,所有的记录都是通过主键来排序,在数据页中有两条特殊的记录分别是Infimum和Supremum分别代表最小项和最大项。数据页中还有一个结构就是目录项,用来快速定位页中的记录。其原理是:数据页中的所有记录会按顺序被分为多个组(每组4到8条记录),而目录项中存的就是组中最后一条记录相对所在页0字节处的偏移量。这样在页中查找数据就可以先在目录项中快速定位到记录所在的范围,然后通过遍历找到记录。在索引页中查找记录与之类似。

定位到记录所在的页

索引页中主要存的其实也是一条一条的记录,记录中存的是当前节点的子节点的页号,以及对应页中的最小主键值。而索引页中的记录也是通过记录中的主键值来排序的。这样就可以在查找一条记录时,从B+树的根节点开始,以一种多分的策略

浅析InnoDB引擎的索引和索引原理的更多相关文章

  1. 聊一聊 InnoDB 引擎中的这些索引策略

    在上一篇中,我们简单的介绍了一下 InnoDB 引擎的索引类型,这一篇我们继续学习 InnoDB 的索引,聊一聊索引策略,更好的利用好索引,提升数据库的性能,主要聊一聊覆盖索引.最左前缀原则.索引下推 ...

  2. mysql InnoDB引擎是否支持hash索引

    看一下mysql官方文档:https://dev.mysql.com/doc/refman/5.7/en/create-index.html , 从上面的图中可以得知,mysql 是支持hash索引的 ...

  3. 谈谈 InnoDB引擎中的一些索引策略

    如果我们在工作能够更好的利用好索引,那将会极大的提升数据库的性能. 覆盖索引 覆盖索引是指在普通索引树中可以得到查询的结果,不需要在回到主键索引树中再次搜索 建立如下这张表来演示覆盖索引: creat ...

  4. InnoDB引擎索引大观

    InnoDB是mysql处理OLTP(online transcation process)类型业务的存储引擎.为了加快数据查询速度.InnoDB引擎提供了丰富的索引实现. 1. 索引的分类 索引能够 ...

  5. 【MySQL】InnoDB引擎ibdata文件损坏/删除后使用frm和ibd文件恢复数据

    参考:http://my.oschina.net/sansom/blog/179116 参考:http://www.jb51.net/article/43282.htm 注意!此方法只适用于innod ...

  6. MySQL:InnoDB存储引擎的B+树索引算法

    很早之前,就从学校的图书馆借了MySQL技术内幕,InnoDB存储引擎这本书,但一直草草阅读,做的笔记也有些凌乱,趁着现在大四了,课程稍微少了一点,整理一下笔记,按照专题写一些,加深一下印象,不枉读了 ...

  7. 聊一聊 InnoDB 引擎中的索引类型

    索引对数据库有多重要,我想大家都已经知道了吧,关于索引可能大家会对它多少有一些误解,首先索引是一种数据结构,并且索引不是越多越好.合理的索引可以提高存储引擎对数据的查询效率. 形象一点来说呢,索引跟书 ...

  8. InnoDB 引擎中的索引类型

    首先索引是一种数据结构,并且索引不是越多越好.合理的索引可以提高存储引擎对数据的查询效率. 形象一点来说呢,索引跟书本的目录一样,能否快速的查找到你需要的信息,取决于你设计的目录是否合理. MySQL ...

  9. MySQL技术内幕InnoDB存储引擎(五)——索引及其相关算法

    索引概述 索引太多可能会降低运行性能,太少就会影响查询性能. 最开始就要在需要的地方添加索引. 常见的索引: B+树索引 全文索引 哈希索引 B+树索引 B+树 所有的叶子节点存放完整的数据,非叶子节 ...

随机推荐

  1. 高德地图&兴趣点(poi)

    <!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <title&g ...

  2. 微信支付 调用支付jsapi缺少参数total_fee 和 支付验证签名失败 prepay_id配置问题

    =======================================================先熟悉一下统一下单api所需要的参数=========================== ...

  3. C# 简单粗暴的毫秒转换成 分秒的格式

    C# 简单粗暴的毫秒转换成 分秒的格式 1:code(网络上很多存在拷贝或者存在bug的或者不满足自己的要求) 1 public static string RevertToTime(double m ...

  4. Red Hat Enterprise Linux 7.2修改主机名(hostname)

    Red Hat Enterprise Linux 7.2在安装的时候,会默认生成主机名:localhost. 那么如何修改成自己想要的自己名? //格式为:用户名@主机名 比如: [root@loca ...

  5. Android Jetpack基本架构之ViewModel+LiveData+DataBinding入门

    前提:导入所有依赖,开启DataBinding app的build.gradle android { defaultConfig { ... dataBinding { enabled true } ...

  6. idea无法使用中文输入法输入

    问题--idea无法使用中文输入 原因:idea本身版本过高,所以需要你强制减低它的jdk版本 解决:使用配置idea环境变量解决 ps:目前适用于任何版本的jdk和idea 步骤: 1.新建一个ID ...

  7. 发布日志 - kratos v2.0.4 版本发布

    V2.0.4 Release Release v2.0.4 · go-kratos/kratos (github.com) 新的功能 proto-gen-http 工具在生产代码时如果 POST/PU ...

  8. 【CSS】按钮

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  9. 20210712 noip12

    考场 第一次和 hzoi 联考,成功给 sdfz 丢人 尝试戴耳罩,发现太紧了... 决定改变策略,先用1h看题,想完3题再写. T1 一下想到枚举最大值,单调栈求出每个点能作为最大值的区间,然后以这 ...

  10. Linux 网卡驱动sk_buff内核源码随笔

    这几天在调试有关网卡驱动的东西,有很多地方不清楚.有关网卡驱动部分主要有两个很重要的结构体:struct net_device 和struct sk_buff. 驱动大部分都是围绕这两个东西进行操作的 ...