学习mysql相关知识记录

发布于:2024-05-02 ⋅ 阅读:(22) ⋅ 点赞:(0)

执行一条select语句,期间发生了什么?

MySQL的执行流程:

  • 连接器
    • TCP连接
  • 查询缓存
    • 很鸡肋被取消
  • 解析SQL
    • 解析器
      • 语法分析
      • 词法分析
  • 执行SQL
    • 预处理器
      • 检查是否存在
      • select * 中的 * 符号,扩展为表上的所有列
    • 优化器
      • 优化器主要负责将 SQL 查询语句的执行方案确定下来
    • 执行器
      • 主键索引查询
      • 全表扫描
      • 索引下推
        • 索引下推(ICP优化)可以减少二级索引在查询时的回表操作,提高查询效率

Mysql的索引

索引是帮助Mysql高效获取数据的排好序的数据结构

索引的数据结构:

  • 二叉树
  • 红黑树
  • Hash表 不支持范围查找
  • B-Tree

二叉树可能变成链表,变成全表扫描了

红黑树二叉平衡树 有自我平衡功能 树的高度太高了 磁盘io太多

B树 :

叶节点具有相同的深度,叶节点的指针为空

所有的索引元素不重复

节点中的数据索引从左到右递增排列

高度为3 的B+树3层可以存大概2千万数据

B+树的非叶子节点占用内存非常少,一般MySQL在启动的时候就将他加载在内存中,因此查询只需一次磁盘io,快的很

存储引擎对应的是表

myisam索引文件和数据文件是分离的

frm表文件

mysql中innoDB的表空间文件结构:

表–>段–>区–>页

每次读取数据都是按页来读取的

B+ 树中的每一层都是通过双向链表链接起来的

在表中数据量大的时候,为某个索引分配空间的时候,就不再按照页为单位分配了,而是按照区为单位分配。每个区的大小为1MB,对于16KB的页来说,连续的64页就被划为一个区,这样就使得链表中相邻的页的物理位置也相邻,这样就可以顺序I/o了

段:是由多个区组成的

一般分为数据段,索引段,回滚段等:

  • 索引段:存放B+树的非叶子节点的区
  • 数据段:存放B+树的叶子节点的区的集合
  • 回滚段:存放回滚数据的区

行的格式:
COMPACT:image-20240501114354802

NULL 是不会存放在行格式中记录的真实数据部分里的

变长字段长度列表:只有数据中有变长字段时才会有

逆序存放 变长字段长度列表:提高CPU Cache的命中率

NULL值列表:
用二进制0 1 来表示 也是逆序的

NULL 值列表也不是必须的。

当数据表的字段都定义成 NOT NULL 的时候,这时候表里的行格式就不会有 NULL 值列表了

记录头信息:

  • delete_mask :标识此条数据是否被删除。从这里可以知道,我们执行 detele 删除记录的时候,并不会真正的删除记录,只是将这个记录的 delete_mask 标记为 1。
  • next_record:下一条记录的位置。从这里可以知道,记录与记录之间是通过链表组织的。在前面我也提到了,指向的是下一条记录的「记录头信息」和「真实数据」之间的位置,这样的好处是向左读就是记录头信息,向右读就是真实数据,比较方便。
  • record_type:表示当前记录的类型,0表示普通记录,1表示B+树非叶子节点记录,2表示最小记录,3表示最大记录

65532

MySQL 的 NULL 值是怎么存放的?

MySQL 的 NULL 值是怎么存放的?MySQL 的 NULL 值是怎么存放的?

varchar(n) 中 n 最大取值为多少?

行溢出后,MySQL 是怎么处理的?