学习mysql相关知识记录

ops/2024/9/23 6:34:14/

执行一条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 是怎么处理的?


http://www.ppmy.cn/ops/33790.html

相关文章

删除虚拟机存储策略中vSAN默认存储策略

登录vSphere Client,展开左上角设置-策略和配置文件-虚拟机存储策略,可以查看系统默认创建的虚拟机存储策略。这些存储策略由系统自动生成,其中有一部分存储策略仅用于vSAN数据存储,作为vSAN 默认存储策略以应用于,当在…

【iOS】KVO

文章目录 前言一、KVO使用1.基本使用2.context使用3.移除KVO通知的必要性4.KVO观察可变数组 二、代码调试探索1.KVO对属性观察2.中间类3.中间类的方法3.dealloc中移除观察者后,isa指向是谁,以及中间类是否会销毁?总结 三、KVO本质GNUStep窥探…

dynamic_cast 静态转换

dynamic_cast 静态转换 const_cast 常量转换 重新解释转换(reinterpret_cast) 最不安全

docker的安装以及docker-compose

什么事docker Docker是一种轻量级的容器技术,可以帮助开发者更加方便地打包、发布和管理应用程序。在Linux系统上安装Docker非常容易. 安装和使用docker 1:首先安装必须的管理工具,使用Linux 终端命令 sudo yum install -y yum-utils device-mapper-per…

程序的机器级表示——Intel x86 汇编讲解

往期地址: 操作系统系列一 —— 操作系统概述操作系统系列二 —— 进程操作系统系列三 —— 编译与链接关系操作系统系列四 —— 栈与函数调用关系操作系统系列五 —— 目标文件详解操作系统系列六 —— 详细解释【静态链接】操作系统系列七 —— 装载操作系统系列…

美团KV存储squirrel和Celler学习

文章目录 美团在KV存储squirrel优化和改进在水平方向1、对Gossip协议进行优化 在垂直扩展方面1、forkless RDB数据复制优化2、使用多线程,充分利用机器的多核能力 在高可用方面 美团持久化kv存储celler优化和改进水平扩展优化1、使用bulkload进行数据导入2、线程模型…

MySQL-存储引擎

将 连接管理,查询缓存,查询优化 等不影响真实数据存储的功能划分为MySQL Server 功能将真实存取数据的功能划分为 存储引擎,存储引擎即表的类型。 1、查看存储引擎 mysql> show engines; ---------------------------------------------…

Java面试问题及答案

Java面试问题及答案 以下是几个Java面试中可能会问到的问题及其答案。 1. 解释Java中的多态性是什么,以及它是如何工作的? 问题: 在Java中,多态性是指允许不同类的对象对同一消息做出响应的能力,即同一个接口可以被…