欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 新闻 > 会展 > 三、mysql-万字长文读懂mysql

三、mysql-万字长文读懂mysql

2026/5/28 18:20:18 来源:https://blog.csdn.net/leeeewwww/article/details/140193110  浏览:    关键词:三、mysql-万字长文读懂mysql

mysql

  • 三、 Mysql
    • 3.1 基础
      • 3.1.1 mysql执行流程-组成架构
    • 3.2 索引
      • 3.2.1 索引底层的数据结构与算法
        • 分类
        • 在创建表时,InnoDB 存储引擎会根据不同的场景选择不同的列作为索引
        • B+树结构
      • 3.2.2 为什么 MySQL InnoDB 选择 B+tree 作为索引的数据结构
        • 3.2.2.1. 从磁盘角度出发
        • 3.2.2.2. 数据结构
          • `数组和二分查找`
          • `二分查找树`
          • `自平衡二叉树(AVL )`
          • `b树`
          • `B+树`
        • 3.2.2.3 Innodb 里的 B+ 树结构
      • 3.2.3 什么时候适用索引
        • 索引缺点
        • 什么时候适用索引
      • 3.2.4 什么时候不需要创建索引
      • 3.2.5 优化索引方法
      • 3.2.6 索引失效的场景
    • 3.3 事务
    • 3.4锁篇
      • 3.4.1 有哪些锁
      • 全局锁
      • 表级锁
    • 3.5 日志
        • 概念
        • undo log
        • Buffer Pool
        • redo log
        • binlog
        • 为什么需要两阶段提交
    • 3.6 内存

三、 Mysql

3.1 基础

3.1.1 mysql执行流程-组成架构

在这里插入图片描述

  • Server 层负责建立连接、分析和执行 SQL。MySQL 大多数的核心功能模块都在这实现,主要包括连接器,查询缓存、解析器、预处理器、优化器、执行器等
  • 存储引擎层负责数据的存储和提取。支持 InnoDB、MyISAM、Memory 等多个存储引擎,不同的存储引擎共用一个 Server 层。现在最常用的存储引擎是 InnoDB

执行一条 SQL 查询语句,期间发生了什么?

  • 连接器:建立连接,管理连接、校验用户身份;
  • 查询缓存:查询语句如果命中查询缓存则直接返回,否则继续往下执行。MySQL 8.0 已删除该模块;
  • 解析 SQL,通过解析器对 SQL 查询语句进行词法分析、语法分析,然后构建语法树,方便后续模块读取表名、字段、语句类型;
  • 执行 SQL:执行 SQL 共有三个阶段:
  • 预处理阶段:检查表或字段是否存在;将 select * 中的 * 符号扩展为表上的所有列。
  • 优化阶段:基于查询成本的考虑, 选择查询成本最小的执行计划;
  • 执行阶段:根据执行计划执行 SQL 查询语句,从存储引擎读取记录,返回给客户端;
  • 在这里插入图片描述

3.2 索引

3.2.1 索引底层的数据结构与算法

分类
  1. 按「数据结构」分类:B+tree索引、Hash索引、Full-text索引
  2. 按「物理存储」分类:聚簇索引(主键索引)、二级索引(辅助索引)
  3. 按「字段特性」分类:主键索引、唯一索引、普通索引、前缀索引
  4. 按「字段个数」分类:单列索引、联合索引
在创建表时,InnoDB 存储引擎会根据不同的场景选择不同的列作为索引
  • 如果有主键,默认会使用主键作为聚簇索引的索引键(key);
  • 如果没有主键,就选择第一个不包含 NULL 值的唯一列作为聚簇索引的索引键(key);
  • 在上面两个都没有的情况下,InnoDB 将自动生成一个隐式自增 id 列作为聚簇索引的索引键(key);
    创建的主键索引和二级索引默认使用的是 B+Tree 索引
B+树结构

如下面表格
在这里插入图片描述
那么B+树是如何存储的?
B+树结构:B+Tree 是一种多叉树,叶子节点才存放数据,非叶子节点只存放索引,而且每个节点里的数据是按主键顺序存放的。每一层父节点的索引值都会出现在下层子节点的索引值中,因此在叶子节点中,包括了所有的索引值信息,并且每一个叶子节点都有两个指针,分别指向下一个叶子节点和上一个叶子节点,形成一个双向链表
在这里插入图片描述

通过主键查询的过程
select * from product where id= 5;

  • 这条语句使用了主键索引查询 id 号为 5 的商品。查询过程是这样的,B+Tree 会自顶向下逐层进行查找:
    • 将 5 与根节点的索引数据 (1,10,20) 比较,5 在 1 和 10 之间,所以根据 B+Tree的搜索逻辑,找到第二层的索引数据 (1,4,7)
    • 在第二层的索引数据 (1,4,7)中进行查找,因为 5 在 4 和 7 之间,所以找到第三层的索引数据(4,5,6);
    • 在叶子节点的索引数据(4,5,6)中进行查找,然后我们找到了索引值为 5 的行数据。
      数据库的索引和数据都是存储在硬盘的,我们可以把读取一个节点当作一次磁盘

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

热搜词