上次写过每个数据页可以组成一个双向链表,每个数据页中的记录会按照主键值从小到大的顺序组成一个单向链表,每个数据页都会为它里面的记录生成一个页目录,通过主键查找某条记录的时候可以在页目录中使用二分法快速定位到对应的槽,然后再遍历该槽对应分组中的记录即可快速定位到指定的记录。

索引

首先我们需要建一个目录为了快速定位记录所在的数据页。需完成以下两点:

  1. 下一个数据页的用户记录的主键值必须大于上一个页中用户记录的主键值,在这过程中,需要移动一些记录来始终保持着这个状态一直成立。
  2. 给所有的页建立一个目录项。(页中的槽是针对页中的记录,目录项是针对所有的页)
    由于这些大小为16KB的页在磁盘上可能并不挨着,在定位某个页时,需要给它们一个编制,每个页对应一个目录项,每个目录项包括两个部分。
    页的用户记录中最小的主键值,用key表示。
    页号,用page_no表示。

这些目录项和普通记录长得很像,不过目录项中两个列是主键和页号,所以复用了之前存用户记录的数据页来存储目录项。用记录头信息的 record_type属性来区分是普通的用户记录还是目录项记录。
record_type:这个属性表示当前的记录的类型,总共有4中类型:

  • 0表示普通记录;
  • 1表示B+树叶节点的目录项记录;
  • 2表示Infimum记录;
  • 3表示Supremum记录;

还有一点区别是只有目录项记录,它的min_rec_flag属性值才有可能为1,普通用户记录的min_rec_flag只能为0。

为了根据主键值定位记录所在的目录项所在的页,把这些存储目录项的页再生成一个更高级的目录,就像一个多级目录一样,大目录里面嵌套小目录。如图:

这是一种组织数据的形式,名称为B+树。
真正的用户记录都在B+树最底层的节点上,这些节点也称为叶子节点或叶节点。
一般情况下,我们用到的B+树都不会超过4层。

聚簇索引

只能用在搜索条件是主键值才能发挥作用。

  1. 使用记录主键值的大小进行记录和页的排序。
  2. B+树的叶子节点存储的是完整的用户记录,就是指这个记录中所有列的值。

二级索引

若我们想要用别的搜索条件时,可以多建几棵B+树。

  1. 使用某列的大小进行记录和页的排序。
  2. B+树的叶子节点存储的并不是完整的用户记录,而是某列+主键这两个列的值。
  3. 目录项记录中不再是主键+页号的搭配,变成了某列+主键值+页号的搭配。

在B+树叶子节点定位到符合条件的用户记录之后,我们需要根据该记录中的主键信息到聚簇索引中查找完整的用户记录。这个携带主键信息到聚簇索引中重新定位完整的用户记录的过程也称为回表。每找到一条符合条件的记录就需要一次回表操作。

联合索引

同时以多个列的大小作为排列规则,同时为多个列建立索引。比如想让B+树按照c2和c3列建立索引。

  1. 先把各个记录按照c2列的大小进行排序。
  2. 在记录c2列相同的情况下,再采用c3列进行排序。

它的本质上也是一个二级索引。

《Mysql是怎样运行的》读书笔记之B+树索引相关推荐

  1. Mysql是怎么运行的读书笔记

    前言 第1章 装作自己是个小白–初识Mysql Mysql分为客户端和服务端,客户端有很多种比如:手机 App.桌面端的软件或者网页版的微信.客户端发送请求,服务端处理请求,服务端将处理结果发送客户端 ...

  2. 《Mysql是怎样运行的》读书笔记之B+树索引的使用

    索引具有时间和空间上的代价. 空间上的代价:每建立一个索引,都会建立一棵B+树,每一棵B+树的每个节点都是一个数据页,一个数据页会默认占用16KB的存储空间,一棵很大的B+树由很多数据页组成,这将占用 ...

  3. 《MYSQL是怎样运行的》笔记|配置文件|系统变量|字符集|InnoDB存储结构|数据页结构|索引结构与使用|数据目录|表空间|连表原理|查询优化|BufferPool|事务|redo与undo|锁

    <MYSQL是怎样运行的>笔记 前记: 历时15天,笔记+看书.完成于2022.2.5. 本书是讲具体的数据库实现,而数据库系统概念见:https://blog.csdn.net/qq_4 ...

  4. 《MySQL是怎么样运行的》读书笔记一 数据页+索引

    登录MySQL cmd命令行中输入:mysql -hlocalhost -uroot -p 之后输入密码. 对于Windows系统来说,默认的用户名是ODBC,你可以通过设置环境变量USER来添加一个 ...

  5. mysql索引与事务笔记_《MySQL技术内幕:InnoDB存储引擎》读书笔记五-锁、索引及事务...

    1.锁mysql 1)锁是数据库系统区别于文件系统的一个关键特性,数据库使用锁是为了支持对共享资源进行并发访问,提供数据的完整性和一致性.算法 2)每一种数据库实现锁的方式都不一样.sql 共享锁:容 ...

  6. MySQL必知必会读书笔记

    第一章 了解SQL 1.1 数据库基础 数据库:保存有组织的数据的容器(通常是一个文件或一组文件).注意要与数据库软件DBMS(数据库管理系统)区别,数据库是通过DBMS创建和操纵的容器.数据库可以是 ...

  7. mysql必知必会读书笔记就——联结表、高级联结

    vendor表: products表: orderitems表: customers表: orders表: 一.联结表:联结表是一种机制,用来在一条select语句中关联表,因此称为联结表.联结在运行 ...

  8. MySQL必知必会读书笔记一

    这篇文章主要是自己阅读<Mysql必知必会>的时候自己写的sql,前面的一部分用的是自己的建立的一个user表,后面用的就是原书的表了 #检索 SELECT id FROM account ...

  9. MYSQL必知必会读书笔记 第二十八章 用户授权

    MySQL用户账户和信息存储在名为mysql的MySQL数据库中.一般不需要直接访问mysql数据库的表,但是有时候会需要直接访问,需要的时机之一就是需要获得所有用户账号列表时. USE  mysql ...

最新文章

  1. 某程序员吐槽清华北大不值钱了!过去清北毕业生去企业上班就是丢人现眼!现在互联网基层员工一堆清北人!清北怎么混成这样了?...
  2. jquery 毫秒转换成日期_基于jQuery的时间戳与日期间的转化
  3. activiti搭建
  4. 四则运算 结对编程
  5. ASP.NET Core Web 资源打包与压缩
  6. inputdstream mysql_【sparkStreaming】将DStream保存在MySQL
  7. 剑指offer--斐波那契数列
  8. 超大图上的节点表征学习
  9. Oracle 数据库管理脚本 命名规范
  10. mysql卸载rpm包_mysql彻底卸载(rpm安装包)
  11. java随机生成昵称
  12. 测试 SEP 14 MP1 新功能 Duplicate Hardware ID 自动修复
  13. C4D中常用材质的创建与赋予
  14. uCos中的信号量机制
  15. 手机wifi java_Android中使用WIFI来连接ADB
  16. 怎样删除wps文档计算机信息,文本框删除,wps怎么删除文本框
  17. WPS:添加公式后,行间距变宽的解决方法
  18. mysql安装ecshop_ecshop图文安装过程详解
  19. 2017-11-3 白银分析
  20. 车辆运动控制(1)车辆运动学建模

热门文章

  1. C语言实现超长整数减法
  2. conda install安装python库失败:PackagesNotFoundError: The following packages are not available from curren
  3. 连接无限·协同无界|融云首届全球企业通信云大会 WECC 来了
  4. 迷你TXT小说阅读器 V2.85 发布!
  5. 最新sogou搜狗搜索 机智操作绕过反爬验证码!
  6. adb教程(很详细)
  7. 同事背后说坏话怎么办?为人再老实,也要做这3件事,吃亏不是福
  8. 降糖奶粉真的降糖吗?育润胰力佳与阿尔发哪个控糖效果更好?
  9. [嵌入式Linux项目实战开发]基于QT4.8的仓库管理系统实现功能【2019年给力项目】
  10. android系统日志如何查看,Android如何查看系统recovery日志,从而找到系统程序、刷机异常…...