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

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

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 · 源码分析 · 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 (

MySQL · 源码分析 · TABLE信息的生命周期

MySQL通过TABLE对象进行表的读写等操作,对于构建TABLE对象所需的表定义相关信息,MySQL会通过Dictionary_client与DD模块进行交互。DD模块通过多级缓存的结构提供了高效而安全的DD信息访问方式,具体介绍见http://mysql.taobao.org/monthly/2021/08/02/。本文旨在讨论TABLE对象及其用到的DD模块中TableImpl信息的生命周期,包括他们的构建、缓存、清理和移除。 ​ ##相关数据结构: TABLE结构描

SQL Server · 引擎特性 · 从SQL Server看列式存储

1. SQL SERVER Column Index存储进展 自2012年以来,SQL Server的Column Index在存储层设计上有了几个大方向上的进展: secondary/primary column index开始支持更新 压缩: 归档压缩 延迟压缩: 当内存的row group写满后先静置一段时间再压缩,这样压缩时就可以过滤掉那些在静置期间被删除的行,row group的有效行填充率会更高,相应的memory/I