MySQL · InnoDB · Instant DDL扩展

概述 DDL(Data Definition Language)定义了数据库内部对象(库、表、列等)上的操作语义。 在MySQL中,根据是否阻塞DML,DDL可分为Copy DDL和Online DDL。其中Copy DDL在执行过程全程持有表级MDL X锁,禁止了其他并发DML操作;而从5.6版本开始引入了Online DDL,即只在元数据操作阶段持有表级MDL X锁,而其他数据操作阶段降级为MDL S锁以支持并发DML操作。 MySQL 8.0版本对DDL的进行了重

MySQL · 源码阅读 · 非阻塞异步C API简介

概述 MySQL从8.0.16版本引入了非阻塞的异步C API接口,可以与 MySQL服务器进行非阻塞通信。原先的同步阻塞式接口在发起某个调用后,客户端必须等待这个调用返回结果才能继续往下执行,而异步非阻塞接口则不需要等待调用返回结果,在发起调用后,客户端可以继续执行后续操作,服务端通过某种反馈机制通知客户端调用是否完成,因此能够提高系统的整体响应速度和吞吐。 MySQL C API接口 无论使用阻塞接口还是非阻塞接口,MySQL client在请求DB查询的时候,通常需要经

MySQL · 源码阅读 · mysqld_safe的代码考古

Part 1 mysqld_safe是一个跟随mysql安装包一起发布的bash脚本,源码目录在scripts/mysqld_safe.sh。核心功能就是启动mysqld,在mysqld进程故障(比如crash)之后,自动探测并重启实例。参考官方文档的说明,mysqld_safe是在Linux部署mysql数据库的推荐方法,执行命令大致如下: mysqld_safe --defaults-file=file_name <options> &am

MariaDB · 功能特性 · 无DDL延迟的主备复制

背景介绍 基于Binlog主备复制是MySQL社区最广泛采用的高可用架构。长期以来,MySQL引入了很多特性来优化备库的复制延迟,比如多线程并行回放、LOGICAL_CLOCK并行复制、WRITESET并行复制。但是DDL延迟一直是MySQL主备复制的顽疾。 这个问题可以参考下图的时间轴理解。DDL语句一般都非常耗时,目前MySQL常用的DDL都支持Online模式,主库执行过程中是不干扰正常读写请求的。不过,这在备库是完全不一样的故事。主库DDL执行成功后会向Binlo

MySQL · 源码阅读 · 数据库的扫描方法

引言 关于存储引擎的介绍有很多,基于HEAP的传统存储引擎,以及基于聚簇索引的Innodb引擎等,但优化器如何充分利用存储引擎的特点来实现快速高效的扫描,从而以最小的代价得到用户所需要的结果,是一个非常复杂过程。为了了解优化器是如何运作的,首先我们要了解每一种扫描方式的特点,下面我们以MySQL为例,就一些常见的表扫描方式进行讨论。 全表扫描 MySQL的full table scan本质上还是通过Primary index scan来实现的,遍历整个B+tree,这是因

MySQL · 源码分析 · Row log分析

引言 早期的MySQL仅支持copy模式的DDL。在MySQL 5.5中,引入了inplace算法,可以将部分DDL操作交给引擎层进行处理,但是在进行DDL期间,依旧会阻塞DML操作。在5.6中,部分inplace DDL操作可以采用online算法。该算法允许用户在进行DDL操作过程中,并行的执行写入操作。有关上述三种DDL的差异及主要特点,可以参照文末的扩展阅读部分。 以add column操作为例,下图给出了online算法进行DDL的主要流程。 可以看到,在

MySQL · 源码阅读 · Purge sys介绍

Purge sys 参考代码8.0.23,purge系统的目的是将不被任何read可见的旧版本数据(undo数据)进行清理。它包含两类处理线程:一类是一个purge coordinator thread,另一类是innodb_purge_threads-1个purge worker threads。 purge coordinator thread:清理删除记录,把purge任务放入队列,唤醒purge worker线程,还要truncate undolog pu

DataBase · 理论基础 · 热点优化 (SIGMOD'21 Paper 解读)

数据库中的热点指的是一小部分记录会被大量的事务频繁读写,这在并发控制时会造成大量的竞争。 热点记录的更新在现实生活中非常常见,比如在电商场景中,秒杀或限购时,会存在大量事务短时间内频繁更新某一行数据,比如更新库存。 本文接下来会先介绍 SIGMOD 2021 上的一篇优化热点竞争问题的论文,Releasing Locks As Early As You Can: Reducing Contention of Hotspots by Violating Two-Phase Lo

DataBase · 存储引擎 · HTAP列存引擎探秘

背景 TP查询和AP查询具有截然不同的特点,促使TP数据库和AP数据库采用不同的设计理念。然而,在一些业务中,事务处理的同时往往会伴随一些分析型的查询,传统的解决方案是由TP数据库进行事务处理,通过ETL将数据导出到AP数据库来服务分析型查询,但是这样的解决方案具有同步延时高、架构复杂、运维难度大、成本高的缺点。在这样的背景下,HTAP数据库应运而生,成为了学术界和工业界关注的热点。 ​ 本文中,我们调研了一些有代表性的HTAP数据库列存引擎实现,分析并总结了HTAP列存引

MySQL · 最佳实践 · 一次InnoDB死锁Bug排查

背景 某天收到一封读者的邮件,询问我一个关于 InnoDB 死锁的问题, 他在 MySQL 5.7 可以复现这个问题, MySQL 8.0.22 却无法复现, 他询问其死锁的原因. 经过一系列的排查,我后来发现是 InnoDB 内部实现的一个 Bug,目前这个 Bug 已经在 8.0.18 版本进行了修复, 所以也可以通过 8.0.17 vs 8.0.18 来验证这个问题. 整个 SQL 流程如下: /* 1. 表结构 */ CREATE TABLE t (