SQL必知必会
陈旸
清华大学计算机博士
立即订阅
10179 人已学习
课程目录
已完结 49 讲
0/4登录后,你可以任选4讲全文学习。
开篇词 (1讲)
开篇词丨SQL可能是你掌握的最有用的技能
免费
第一章:SQL语法基础篇 (19讲)
01丨了解SQL:一门半衰期很长的语言
02丨DBMS的前世今生
03丨学会用数据库的方式思考SQL是如何执行的
04丨使用DDL创建数据库&数据表时需要注意什么?
05丨检索数据:你还在SELECT * 么?
06丨数据过滤:SQL数据过滤都有哪些方法?
07丨什么是SQL函数?为什么使用SQL函数可能会带来问题?
08丨什么是SQL的聚集函数,如何利用它们汇总表的数据?
09丨子查询:子查询的种类都有哪些,如何提高子查询的性能?
10丨常用的SQL标准有哪些,在SQL92中是如何使用连接的?
11丨SQL99是如何使用连接的,与SQL92的区别是什么?
12丨视图在SQL中的作用是什么,它是怎样工作的?
13丨什么是存储过程,在实际项目中用得多么?
14丨什么是事务处理,如何使用COMMIT和ROLLBACK进行操作?
15丨初识事务隔离:隔离的级别有哪些,它们都解决了哪些异常问题?
16丨游标:当我们需要逐条处理数据时,该怎么做?
17丨如何使用Python操作MySQL?
18丨SQLAlchemy:如何使用Python ORM框架来操作MySQL?
19丨基础篇总结:如何理解查询优化、通配符以及存储过程?
第二章:SQL性能优化篇 (18讲)
20丨当我们思考数据库调优的时候,都有哪些维度可以选择?
21丨范式设计:数据表的范式有哪些,3NF指的是什么?
22丨反范式设计:3NF有什么不足,为什么有时候需要反范式设计?
23丨索引的概览:用还是不用索引,这是一个问题
24丨索引的原理:我们为什么用B+树来做索引?
25丨Hash索引的底层原理是什么?
26丨索引的使用原则:如何通过索引让SQL查询效率最大化?
27丨从数据页的角度理解B+树查询
28丨从磁盘I/O的角度理解SQL查询的成本
29丨为什么没有理想的索引?
30丨锁:悲观锁和乐观锁是什么?
31丨为什么大部分RDBMS都会支持MVCC?
32丨查询优化器是如何工作的?
33丨如何使用性能分析工具定位SQL执行慢的原因?
34丨答疑篇:关于索引以及缓冲池的一些解惑
35丨数据库主从同步的作用是什么,如何解决数据不一致问题?
36丨数据库没有备份,没有使用Binlog的情况下,如何恢复数据?
37丨SQL注入:你的SQL是如何被注入的?
第三章:认识DBMS (7讲)
38丨如何在Excel中使用SQL语言?
39丨WebSQL:如何在H5中存储一个本地数据库?
40丨SQLite:为什么微信用SQLite存储聊天记录?
41丨初识Redis:Redis为什么会这么快?
42丨如何使用Redis来实现多用户抢票问题
43丨如何使用Redis搭建玩家排行榜?
44丨DBMS篇总结和答疑:用SQLite做词云
第四章:SQL项目实战 (3讲)
45丨数据清洗:如何使用SQL对数据进行清洗?
46丨数据集成:如何对各种数据库进行集成和转换?
47丨如何利用SQL对零售数据进行分析?
结束语 (1讲)
结束语 | 互联网的下半场是数据驱动的时代
SQL必知必会
登录|注册

27丨从数据页的角度理解B+树查询

陈旸 2019-08-12
我们之前已经了解了 B+ 树和 Hash 索引的原理,这些索引结构给我们提供了高效的索引方式,不过这些索引信息以及数据记录都是保存在文件上的,确切说是存储在页结构中。
对数据库的存储结构以及页结构的底层进行了解,可以加深我们对索引运行机制的认识,从而你对索引的存储、查询原理,以及对 SQL 查询效率有更深的理解。
今天的课程主要包括下面几个部分:
数据库中的存储结构是怎样的?页、区、段和表空间分别指的是什么?
为什么页(Page)是数据库存储空间的基本单位?
从数据页的角度来看,B+ 树是如何进行查询的?

数据库中的存储结构是怎样的

记录是按照行来存储的,但是数据库的读取并不以行为单位,否则一次读取(也就是一次 I/O 操作)只能处理一行数据,效率会非常低。因此在数据库中,不论读一行,还是读多行,都是将这些行所在的页进行加载。也就是说,数据库管理存储空间的基本单位是页(Page)。
一个页中可以存储多个行记录(Row),同时在数据库中,还存在着区(Extent)、段(Segment)和表空间(Tablespace)。行、页、区、段、表空间的关系如下图所示:
从图中你能看到一个表空间包括了一个或多个段,一个段包括了一个或多个区,一个区包括了多个页,而一个页中可以有多行记录,这些概念我简单给你讲解下。
取消
完成
0/1000字
划线
笔记
复制
© 版权归极客邦科技所有,未经许可不得传播售卖。 页面已增加防盗追踪,如有侵权极客邦将依法追究其法律责任。
该试读文章来自付费专栏《SQL必知必会》,如需阅读全部文章,
请订阅文章所属专栏。
立即订阅
登录 后留言

精选留言(23)

  • Monday
    Mysql如text、MediumText等类型最大存储长度为64k、16M,已经超过了一个页16k,请问包含这几种类型的记录都怎么存储的?
    2019-08-12
    10
  • 我行我素
    1.逻辑上连续的,在文中有说采用链表的结构让数据页之间不需要是物理上的连续,而是逻辑上的连续;
    2.二分查找发,在总结图中有详细的说明,首先是从B+树的根开始,逐层检索直到叶子节点,找到叶子节点对应的数据页,将数据页加载到内存中,通过页目录中的槽采用二分查找的方式先找到一个粗略的记录分组,在分组中通过链表遍历的方式进行记录的查找
    2019-08-12
    2
    10
  • Monday
    关于数据页有几个疑问:
    1、分组1为什么只有一条记录?
    2、分组之间采用的是二分查找,表示分组1,分组2,...,分组n之间是通过某种顺序进行排列的。假设除了最后一个分组n外,所有的分组都存储满了8条记录,这时新增一条记录x按有序性应该放置在分组2中,是不是分组2,3,分组n-1都需要进行记录的改动?
    3、最大最小记录是专门给数据页内二分查找赋值low与high设计的?
    2019-08-12
    8
  • wusiration
    问题1:聚集索引是在物理上连续,因为聚集索引是指表中数据行按索引的排序方式进行存储,表设置了聚集索引,数据行会按照索引列的值在磁盘上物理存储和排序;(摘抄自23索引的概览)
    问题2:先是从B+树的根开始,逐层检索找到相应叶子节点对应的数据页,将数据页加载到内存中,通过页目录中的槽采用二分查找的方式先找到一个粗略的记录分组,在分组中通过链表遍历的方式进行记录的查找
    2019-08-12
    2
    5
  • 老毕
    逻辑上连续,物理上未必连续。数据库的最小分配单位是页,连续分配一定数量的物理页构成段。每页存储只够存储有限的记录,记录不断增加,一定会超出页,继而超出段,无法保证物理连续。进一步说,数据库的磁盘分配操作基于操作系统,单个“页”是否一定在物理介质上连续,也不一定。

    B+树只有叶节点含有数据指针,总是从根节点开始检索,直到叶节点。如果是范围检索,只需要一次根到叶的检索,然后就能借助叶节点的双向链表结构特性,顺序移动直到找出所有满足范围的数据。
    2019-08-13
    3
  • Leon📷
    A clustered index, on the other hand, is actually the table. It is an index that enforces the ordering on the rows of the table physically.物理上连续的
    2019-09-12
    1
    1
  • 小智e
    请问一下老师,这些内容的源头是在哪里呢?想去源头看看

    作者回复: 感谢兴趣,最直接的来源就是官方的Document,比如 https://dev.mysql.com/doc/internals/en/innodb-fil-header.html 而且检索起来也很方便,比如你想要查询优化器的cost model是如何设计的,就可以找到 https://dev.mysql.com/doc/refman/8.0/en/cost-model.html

    2019-08-23
    1
  • 阿恺
    关于普通索引和唯一索引的效率问题还想请教一下:普通索引不是主键,不是物理索引,叶子节点记录的是行的位置,实际可能分散在多个页中,那就存在多次IO读取,效率会降低,为什么说差不多?
    2019-08-13
    1
  • 往事随风,顺其自然
    逻辑上连续的,记录之间采用单链表方式实现
    2019-08-12
    1
  • ballgod
    建议最后给出的问题,老师在回复里给一下答案,谢谢
    2019-12-11
  • 聚集索引是在物理上的顺序和逻辑上的顺序相同
    2019-11-22
  • 书痕
    关于问题1,应该只是通过双向链表保证数据在逻辑上与聚集索引顺序一致,物理介质上不一定连续
    2019-11-01
  • 小王子与偷影子的人
    思考题1

    摘自23讲:
    聚集索引指表中数据行按索引的排序方式进行存储,对查找行很有效。只有当表包含聚集索引时,表内的数据行才会按找索引列的值在磁盘上进行物理排序和存储。每一个表只能有一个聚集索引,因为数据行本身只能按一个顺序存储。
    2019-10-18
  • Yuhui
    请教一下老师,”通过文件尾的校验和(checksum 值)与文件头的校验和做比较“来判断页数据传输是否完整这个是怎么回事?谢谢!

    作者回复: 校验和checksum经常用于数据传输过程中的数据完整性/准确性校验。checksum算法有很多,举个例子比如MD5算法,在文件头的时候给出完整的文件应该得到的MD5数值为多少,等到文件尾的时候,再使用MD5对整体进行运算,看下和文件头给出的是否一致。如果一致,则说明传输过程是完整正确的,如果不一致则存在错误,需要重新传输。

    2019-09-19
  • wonderq_gk
    "非叶子节点,包括了多个索引行,每个索引行里存储索引键和指向下一层页面的页面指针"
    感觉是不是说错了,指向下一层页面的页面指针不是在文件头里面吗?
    2019-08-27
  • 习惯沉淀
    老师,“在B+树中,每一个节点都是一个页”这句,有点不太理解,非叶子节点不是不存放行记录吗,非叶子节点就是页,只不过页里面不存放数据是这意思吗?

    作者回复: 对 B+树的非叶子节点不存放具体的行记录数据。

    2019-08-20
  • asdf100
    对页里查找记录时,可先根据二分查找法,先找到记录所有在槽,时间复杂度为O(log2n)。槽内有多条记录,再遍历所有记录,直到找到指定记录为止,时间复杂度为O(n)。
    2019-08-13
  • asdf100
    遍历槽 3 中的所有记录,找到关键字为 9 的记录,取出该条记录的信息即为我们想要查找的内容。由于单链表,所以查询复杂度为O(n)
    2019-08-13
  • 💢 星星💢
    老师,怎么理解B+树里面的关键字?是不是可以了理解为就是索引的编号呢。。
    2019-08-12
  • 往事随风,顺其自然
    查找页目录的时候,需要遍历所有的数据页目录?还是说创建索引后这些页目录已经排好序了
    2019-08-12
收起评论
23
返回
顶部