MySQL · 内核特性 · 8.0 新的火山模型执行器
MySQL的总体架构通常我们认为MySQL的整体架构如下,官方10年前开始就一直在致力于优化器代码的重构工作,目的是能确保在SQL的执行过程中有清晰的阶段,包括分离Parse和Resolve阶段、更好的支持更多新的语法、保证Name和Type的解析、尽量在Prepare阶段做完Transformations,这样能够很容易的支持CTEs、Windows函数、LATERAL语法、JSON的Table函...
View ArticleMongoDB · 内核特性 · wiredtiger page逐出
背景MongoDB默认使用的存储引擎是wiredtiger,而wiredtiger使用MVCC来实现并发控制,会在内存中维护文档的多版本并提供无锁访问,这会带来更好的并发性能,但也会带来更多的内存占用。所以wiredtiger内部使用了多种方法来尽快逐出内存中的数据页,以留下更多的内存给其它读写访问。下面,我们会先详细介绍wiredtiger中用户表在磁盘和内存中的组织形式,然后通过了解文档的事务可...
View ArticleAliSQL · 内核特性 · 快速 DDL
优化背景DDL是数据库运行期间不可避免的操作,MySQL用户经常会遇到DDL相关的问题包括:为什么加个索引会造成实例的抖动,影响正常的业务读写?为什么一个不到 1G 的表执行 DDL 有时需要十几分钟?为什么使用了 temp table 的连接退出会造成实例抖动?针对这些问题,RDS内核团队进行分析后发现 MySQL 在 DDL...
View ArticleMySQL · 内核特性 · semi-join四个执行strategy
一 semi-join介绍所谓的semi-join就是一个子查询,它主要用于去重,当外表查找在内表满足条件的records时,返回外表的records,也就是说它只返回存在内表中的外表的记录,如下图所示:对应的语法:SELECT ... From Outer_tables WHERE expr in (SELECT ... From Inner_tables ...) And ... SELECT...
View ArticleMySQL · 引擎特性 · InnoDB redo log thread cpu usage
InnoDB 在8.0 里面把写redo log 角色的各个线程都独立出来, 每一个thread 都处于wait 状态, 同样用户thread 调用log_write_up_to 以后, 也会进入wait 状态.这里的wait 等待最后都是通过调用 os_event_wait_for 来实现, 而 os_event_wait_for 是先spin + wait...
View ArticlePgSQL · 引擎特性 · SQL防火墙使用说明与内核浅析
背景简介SQL注入通常是业务层做的事情,例如使用绑定变量,使用关键字过滤等手段,避免被SQL注入。SQL防火墙便是数据库层面的防火墙功能。该插件可以用来学习一些定义好的SQL规则,并将这些规则储存在数据库中作为白名单。当用户学习完成后,可以限制用户执行这些定义规则之外的风险操作。使用说明认识学习模式,预警模式与防火墙模式 SQL防火墙共有三种模式,学习模式、预警模式与防火墙模式。 •...
View ArticleMySQL · 引擎特性 · truncate table在大buffer pool下的优化
背景:目前5.7仍然是使用最为广泛的版本,但是在实际的业务运维中,我们经常碰到truncate表时导致tps/qps抖动从而影响业务的情况,如果truncate的表比较多,监控就会像下图这样:通过抓取堆栈发现: 0000000001237cce buf_LRU_flush_or_remove_pages(unsigned long, buf_remove_t, trx_t const*)...
View ArticleMySQL · 引擎特性 · INNODB UNDO LOG分配
INNODB UNDO LOG分配本文只描述独立UNDO表空间下的undo log的分配算法以及实现。根据我们之前的UNDO LOG物理格式描述,分配undo log得先分配回滚段,然后再从回滚段内分配undo log。分配undo回滚段每个独立UNDO表空间存在若干个(默认128)个回滚段,而每个回滚段又默认存在1024个UNDO LOG SLOT,分配undo...
View ArticleMySQL · 内核特性 · Redo Logging动态开关
前言我们都知道数据库利用write-ahead logging(WAL)的机制,来保证异常宕机后数据的持久性。即提交事务之前,不仅要更新所有事务相关的Page,也要确保所有的WAL日志都写入磁盘。在InnoDB引擎中,这个WAL就是InnoDB的redo log,一般存储在ib_logfilexxx文件中,文件数量可通过my.cnf配置。在MySQL...
View ArticleMySQL · 引擎特性 · InnoDB Buffer Page 生命周期
前言InnoDB 没有使用操作系统自己的 Page Cache 机制,而是自己设计了一套 Buffer Pool 来进行 Page 的管理,关于 InnoDB Buffer Pool 的介绍,可以参考这篇文章,里面对 InnoDB Buffer Pool 作了比较深入的介绍。本文尝试从另外一个角度介绍一下一个 Buffer Page 的生命周期。本文给出的所有示例代码均基于 MySQL 8.0.18...
View ArticleMySQL · 引擎特性 · InnoDB UNDO LOG写入
INNODB UNDO LOG写入我们在之前的章节中提到,UNDO LOG分为INSERT和UPDATE两种类型。接下来我们分别描述这两种记录如何写入UNDO LOG RECORD。行记录在插入或者更新时,除写入索引记录外,还会同时写入UNDO LOG。对于新插入的行记录,会将新插入的行记录写入UNDO LOG,而对于被更新的行记录,则是将更新前的记录旧值写入UNDO...
View ArticleMySQL · 引擎特性 · InnoDB 数据文件简述
通常,我们在使用Mysql时,Mysql将数据文件都封装为了逻辑语义Database和Table,用户只需要感知并操作Database和Table就能完成对数据库的CRUD操作,但实际这一系列的访问请求最终都会转化为实际的文件操作,那这些过程具体是如何完成的呢,具体的Database和Table与文件的真实映射关系又是怎样的呢,下面笔者将通过对Mysql8.0...
View ArticleDatabase · 案例分析 · UTF8与GBK数据库字符集
问题背景现有数据库A与数据库B,数据库A服务端由GBK编码,数据库B服务端由UTF8编码,需要完成数据库A至数据库B的数据导入,测试中发现A库数据插入B数据库时的部分数据进行查询时存在编码转换报错。问题分析角色分析首先阐述影响字符编码的几个要素 •...
View ArticleMySQL · 性能优化 · PageCache优化管理
背景监控线上实例时,曾出现可用内存不足,性能发生抖动的情况。研究后发现是日志文件的page cache占用了大量的内存(200G+),导致系统可立即分配的内存不足,影响了系统性能。查看linux内核文档发现,操作系统在内存的使用未超过上限时,不会主动释放page cache,以求达到最高的文件访问效率;当遇到较大的内存需求,操作系统会当场淘汰一些page cache以满足需求。由于page...
View ArticleMySQL · 分布式系统 · 一致性协议under the hood
在我看来包含 log, state machine, consensus algorithm 这3个部分, 并且是有 electing, normal case, recovery 这3个阶段都可以称为paxos 协议一族.为什么说raft 也是3个阶段, 因为其实raft 在重新选举成leader 以后, 也是需要一段recovery 的时间, 如果超过半数的follower 没有跟上leader...
View ArticleX-Engine · 性能优化 · Parallel WAL Recovery for X-Engine
背景数据库的Crash Recovery时长关系到数据库的可用性SLA、故障止损时间、升级效率等多个方面。本文描述了针对X-Engine数据库存储引擎的一种Crash...
View ArticleMySQL · 源码阅读 · InnoDB伙伴内存分配系统实现分析
1 Why?问题一:InnoDB为什么会需要伙伴内存分配系统?InnoDB使用的内存分为以下几块:Buffer poolRedo log bufferDD cacheAdaptive hash index每个事务用到的Lock需要的内存SQL执行过程中需要的临时内存其中占用内存最多的是Buffer Pool和Redo Log Buffer,都有自己专门的内存管理机制,基于定长的Page...
View ArticlePgSQL · 新特性探索 · 浅谈postgresql分区表实现并发创建索引
背景在数据库中索引可谓是司空见惯,优化查询的利器,其常用程度和表已无差别且更有甚之。索引建立的最合适时间是在定义表之后在表中插入数据之前,当一个表中已经包含了大量的数据再去建立索引意味着需要对全表做一次扫描,这将是一个很耗时的过程。 在Postgres中,在一个表上创建索引时会在表上加一个ShareLock锁,这个锁会阻塞DML(INSERT, UPDATE,...
View ArticleMySQL · 引擎特性 · InnoDB隐式锁功能解析
隐式锁概述在数据库中,通常使用锁机制来协调多个线程并发访问某一资源。MySQL的锁类型分为表锁和行锁,表示对整张表加锁,主要用在DDL场景中,也可以由用户指定,主要由server层负责管理;而行锁指的是锁定某一行或几行,或者是行与行之间的间隙,行锁由存储引擎管理,例如最常使用的InnoDB。表锁占用系统资源小,实现简单,但锁定粒度大,发生锁冲突概率高,并发度比较低。行锁占用系统资源大,锁定粒度小,发...
View ArticleMySQL · Optimizer · Optimizer Hints
背景优化器是关系数据库的重要模块 [1] [2],它决定 SQL 执行计划的好坏。但是,优化器的影响因素很多,由于数据变化和估计准确性等因素,它不能总是产出最优的执行计划 [3] 。选择了不同的执行计划,执行效果差异可能非常大,甚至达到数量级差异,可能对生产系统产生严重影响。虽然学术和业界长期致力于优化器的改进,但对于业务系统而言,在优化器犯错的时候,需要有一些直接有效的干预办法。Optimizer...
View Article