MySQL 相关子查询
本文主要介绍了不相关子查询转换为相关子查询之后,explain 结果中子查询 type、ref 列的显示逻辑,物化和相关子查询两种执行策略的成本计算,以及简单介绍了相关子查询的执行流程。
MySQL 全表扫描成本计算
本文介绍全表扫描成本计算的逻辑。
MySQL 不相关子查询怎么执行?
子查询系列正式的第一篇文章,介绍不相关子查询的逻辑,以及写这类 SQL 时最佳实践。
where field in(...) 是怎么执行的?
本文介绍不包含子查询的 in 条件,判断和记录是否匹配的两种方式,以及需要进行的准备工作。
MySQL 连接怎么保活?
本文介绍了数据库连接保活的原理和 2 种保活方式,以及对比了这 2 种保活方式的执行效率。
MySQL 8.0 数据字典表
MySQL 8.0 对数据字典进行了重构,最重要的改变就是数据字典表被 InnoDB 大一统了,由此带来的好处就是 DDL 不会半途而废变成四不像了。
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 查看排序过程中的更多细节。