数据库从入门到入土

本文介绍了数据库的范式、语句执行过程和事务特性。范式分为第一范式到第五范式,每个范式都有不同的要求和优势。语句执行过程包括连接器、查询缓存、解析 SQL 和执行 SQL 等阶段,其中涉及到连接池、缓冲区管理和查询优化器等机制。事务具有原子性、一致性、隔离性和持久性四个特性,可以通过锁机制实现并发控制。文章还介绍了索引的数据结构和使用场景,以及存储过程和 NoSQL 数据库 Redis 的概述。最后还提到了数据库持久化的方法和 Redis 的哨兵机制。

范式

语句执行

执行简单 select 语句

架构简单分层

连接器

查询缓存

解析 SQL

执行 SQL

缓冲区管理

执行 update 语句

相较于普通 select 额外执行的部分。

两阶段提交

异常分析

缺陷

事务

特性

隔离性

日志

WAL 技术

WAL,即 Write-Ahead Logging 技术,MySQL 的写操作并不是立即写到磁盘上,而是先写日志,然后在合适的时间刷新到磁盘。

分类

Undo Log

设计思路

insert 格式

正如 insert 操作思路,记录主键所占用的空间和值,回滚时根据主键值删除记录即可。

delete 格式

删除一条记录的两个阶段

两阶段缘由:支持 MVCC 机制,便于回滚。
  1. delete mask 阶段
    • 将 delete_flag 位设置为 1,但没有将记录移到垃圾链表,在这个删除对应的事务提交前,一直保持着这种中间状态。
    • 由于事务提交后就不需要回滚了,因而只需要针对此阶段考虑 undo log 设计即可。
  2. purge 阶段 - 事务提交后,会有专门的线程负责将记录删除,包括从正常记录链表中移除、移至垃圾链表、修改页面相关信息等操作。
    相较于 insert 操作对应格式的 undo 日志,delete 操作对应的 undo 日志还需要记录被包含在索引中的列的相关信息,主要用于后续 2 阶段对记录实现真正删除。

update 格式

不更新主键

更新主键

一旦更新主键,由于记录在聚簇索引中按照主键值连成了单向链表,这条记录的位置很可能发生较大改变。因而,针对这种情况,innoDB 的做法和删除类似,首先 delete mask 阶段(防止真正删除导致别的事务无法访问),然后再根据更新的值生成一条新记录,插入聚簇索引。

更新二级索引

更新二级索引,就意味着也要对旧记录进行 delete mask 操作,然后根据更新后的值插入新的记录到二级索引中。

存储

每个事务都有自己的 undo 页面链表,避免事务间争抢 undo 页面链表指针,使之成为热点资源。一个事务中最多可以分配四个 undo 页面链表:

Redo Log

定义

配置与写入

和 Undo Log 辨析

修改 undo log 数据页后,也会记录对应的 redo log。

BinLog

定义

Server 层负责生成,在 MySQL 完成涉及数据库表结构变更和表数据修改的操作后,会生成一条 binlog,事务提交时统一将 binlog 写入文件。
每次提交事务都会把 binlog 写到 page cache(速度快,不涉及磁盘 I/O),sync_binlog 参数控制是否持久化到磁盘,为 0 时表示交由操作系统决定什么时候持久化(默认,风险大,性能好),为 1 时是每次事务提交都持久化(性能差,但至多丢失一个事务),为 2 时累积指定事务数同步(兼顾,实际开发通常设置为 100~1000)。

格式

和 Redo Log 辨析

主从复制

索引

数据结构

最左匹配原则

场景选择

优劣

场景

前缀索引

定义

使用某个字段中的前几个字符建立索引,减小索引字段大小,增加一个数据页中存储的索引数量,有效提高查询速度。

局限性

主键索引自增

为什么选用自增 ID 做主键,而非也能确保唯一性的 UUID。

自适应哈希索引

hash 结构是所有数据类型中最快的,所以 innoDB 会对统计出的经常走索引查询的热点数据建立哈希索引,提升查询性能。

某个唯一字段不涉及范围查询,也无需排序或分组时,可以用 hash 结构替代 B+树结构。

MRR 机制

MRR,即 Multi-Range Read,MySQL5.6 版本引入,主要针对辅助索引的回表查询,将查询出的 ID 先放到缓冲区,待全部索引检索完成或缓冲区数据达到阈值,对其中 ID 排序,根据顺序 ID 回表查询数据。减少了离散 I/O,将随机 I/O 转换成顺序 I/O,提高查询效率。

分库分表

分库

分表

Explain 语句

查看 SQL 的执行计划,分析语句和表结构的性能瓶颈,统计估算记录数(比执行 count 函数快很多,如搜索引擎返回的数量即是估测数量)。

字段解析

局限

行级锁

存储过程

NoSQL

Memcached

和 Redis 区别

Redis

数据结构

String

List

Hash

Set

Zset

BitMap

HyperLogLog

GEO

Stream

线程模型

持久化

AOF

RDB

混合持久化

过期策略

哨兵机制



正在加载今日诗词....

📌 Powered by Obsidian Digital Garden and Vercel
载入天数...载入时分秒...