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 索引底层的数据结构与算法
分类
- 按「数据结构」分类:B+tree索引、Hash索引、Full-text索引。
- 按「物理存储」分类:聚簇索引(主键索引)、二级索引(辅助索引)。
- 按「字段特性」分类:主键索引、唯一索引、普通索引、前缀索引。
- 按「字段个数」分类:单列索引、联合索引。
在创建表时,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 的行数据。
数据库的索引和数据都是存储在硬盘的,我们可以把读取一个节点当作一次磁盘