MySQL 崩溃恢复过程分析
MySQL 崩溃恢复的核心工作是应用 Redo 日志把数据页恢复到崩溃之前的最新状态,以及从 undo 日志中读取未完成事务的信息,并根据事务状态进行清理、提交、回滚等操作。
MySQL 事务二阶段提交
二阶段提交的核心逻辑是把多个事务的 Redo 日志合并刷盘,把多个事务的 binlog 日志合并刷盘,从而把少量数据多次 IO 变为更大数据更少 IO,最终达到提升事务提交效率的目标。
InnoDB 行超长时怎么选择溢出字段?
页大小为 16K 时,InnoDB 中一条记录的长度如果超过 8126 字节,记录中就会有部分字段的内容被存放到溢出页。这篇文章来聊聊溢出字段的选择逻辑。
Undo 日志用什么存储结构支持无锁并发写入?
undo 日志承担着多重职责,需要为 MVCC 和数据一致性服务。相比于 redo 日志,它拥有更复杂的存储结构,和事务有更多的关联。本文从存储结构、写入 undo 日志文件、二阶段提交三个方面介绍了 undo 日志。
Redo 日志从产生到写入日志文件
MySQL 8.0 中,多个线程往 log buffer 中写入 Redo 日志,使用了无锁化设计实现并行写入,并且 log buffer 中的日志写入日志文件、刷盘都使用了独立线程,结构复杂了很多,负载比较高的情况下写入效率也大大提升了。
InnoDB B-TREE 索引怎么计算 WHERE 条件范围内有多少条记录?
本文根据扫描区间左右端点记录所在位置的不同,分 5 种场景分别介绍了 InnoDB 计算扫描区间中记录数量的过程。
InnoDB B-TREE 索引怎么定位一条记录?
本文以定位查询语句 WHERE 条件对应的扫描区间的第一条记录为例,详细分析了 InnoDB B-TREE 索引中定位一条记录的过程,以及 InnoDB 对于定位过程的优化方案。
insert ... on duplicate key update 和 replace into
本文介绍了 insert ... on duplicate key update 和 replace into 语句执行成功后影响行数的计算逻辑,以及分析了这两种 SQL 插入记录的执行过程。
count(distinct) 玩出了新花样
本文以 MEMORY 引擎支持的两种索引结构为切入点,介绍了 count(distinct) 为什么选择只使用红黑树去重,对去重和分组计数过程进行了详细分析,以及对比了和 sum(distinct)、avg(distinct) 的不同之处。
临时表和文件排序实现 group by
本文主要分析了使用临时表 + 文件排序、只使用文件排序实现 group by 的过程,以及文件排序在这两种实现方式中的含义。
你好奇过 MySQL 内部临时表存了什么吗?
本文介绍了 MySQL 内部临时表会包含哪些字段,哪些字段上会建立索引,怎么选择存储引擎,怎么控制内存临时表的大小,以及临时表的使用情况统计。
MySQL 大对象(BLOB)和字符串的分身术
本文介绍了 MySQL 中,text、blob、json、几何图形(spatial type)都属于大对象,char、binary 都属于定长字符串,varchar、varbinary 都属于变长字符串,源码实现中是怎么区分这些类型的。
MySQL 怎么用索引实现 group by?
本文以 avg()、min() 为例介绍了紧凑索引扫描、松散索引扫描实现 group by 的过程。MySQL 怎么选择两种索引扫描方式,松散索引扫描的变种,以及为什么有时候松散索引扫描比紧凑索引扫描成本更高。
带你一步一步深入了解 MySQL Order By 文件排序
本文介绍了文件排序的三种排序模式,源码中提升排序执行效率的两种优化方案,内部排序的三种排序算法,外部排序过程中多路归并排序的过程,倒序排序的实现,以及通过 optimizer trace 查看排序过程中的更多细节。
聊聊 MySQL 网络缓冲区、net_buffer_length、max_allowed_packet 那些事
本文主要介绍了连接缓冲区、结果集缓冲区,它们的自动增长逻辑和上下限。以及超过 16M 的大数据怎么发送和接收,net_buffer_length、max_allowed_packet 两个系统变量的配置。
MySQL 简单查询语句执行过程分析(五)发送数据给客户端
查询语句执行过程分析第 5 篇,讲述发送字段元数据和数据记录给客户端时,会发送字段的那些元数据信息,以及各种类型的字段在发送之前会做哪些处理。
MySQL 简单查询语句执行过程分析(四)WHERE 条件
本文是查询语句执行过程分析的第 4 篇,主要讲述源码中 where 条件的结构,where 条件的比较过程,以及 enum、set、bit 三种类型的字段作为 where 条件是怎么比较的。
MySQL 简单查询语句执行过程分析(三)从存储引擎读数据
本文是查询语句执行过程分析的第 3 篇,主要讲述 MySQL 从 InnoDB 读取数据的过程中,涉及到的那些操作。
MySQL 简单查询语句执行过程分析(二)查询准备阶段
本文是查询语句分析文章的第 2 篇,主要讲述一条简单查询语句,在查询准备阶段会干哪些事情?
MySQL 简单查询语句执行过程分析(一)词法分析 & 语法分析
本文对一条简单的 SELECT 语句执行过程中的词法分析 & 语法分析阶段的过程进行分析。