MySQL 深潜 - Semijoin 丛林小道全览
MySQL semijoin 也被称为半连接,主要是解决外查询一个或多个表的记录在包含一个或多个表的子查询结果中的存在性问题,比如 IN/EXIST 子查询。如果按照 IN/EXIST 谓词的原语义去执行,对外查询的每行记录都去计算 IN/EXIST 谓词的结果,子查询的内容就需要单独执行,在关联子查询的情况下,子查询需要多次重复执行,整体的执行效率很低。实际上,部分存在性问题(SPJ...
View ArticlePolarDB MySQL 冷数据DDL优化
过去,PolarDB 在处理归档的冷数据时,遇到的主要挑战之一是对数据定义语言(DDL)操作的兼容性和效率问题,尤其是在执行诸如增加列、调整列宽等操作时。由于这些操作通常要求数据重写,通过 COPY 机制来实现,导致了极高的资源消耗和执行成本。这一局限性在持续归档至 OSS 外表的场景中尤为突出,给数据管理和运维工作带来了不便。 为应对这一挑战,我们引入了 OSS META...
View ArticlePolarDB MySQL 冷数据查询性能优化
PolarDB for MySQL 在优化冷数据查询性能方面,聚焦于两项核心技术策略:OSS 数据筛选与OSS冷数据并行查询技术。 首先,OSS数据筛选机制通过利用高度针对性的列属性预处理,实现对数据对象的智能过滤。这一策略能够显著缩减数据扫描范围,避免不必要的时间消耗于无关数据的检索上,从而大幅提升查询效率与系统响应速度。...
View ArticlePostgreSQL 子事务探秘
在 PostgreSQL 中,子事务(也称为 “savepoints”)是事务管理中的一个高级特性,它允许用户在一个大的事务内部定义一个或多个savepoints点。这些savepoints允许在发生错误时回滚到某个savepoint,而不是整个事务。子事务是非常有用的,尤其是在事务内处理一系列复杂的操作时,需要在发生错误后从中间的某个操作开始恢复,而不是完全从头开始。 子事务的作用...
View Article使用PT_PERF排查线上慢SQL问题
背景 在我们线上的客户有一个实例,在每天固定的时间都会出现慢SQL的问题;该用户线上业务对于SQL执行的时间较为严格,执行时间超过150ms就认为是慢SQL。...
View ArticlePostgreSQL 插入常量的合法性检查
本文简单介绍 PostgreSQL 数据库如何对 INSERT 语句中的常量进行合法性检查,检查逻辑从上到下涉及到词法分析、语法解析、语义分析、查询优化、参数绑定、执行器等多个模块。 全文的所有代码都以 PostgreSQL 14 为例,所有 SQL 示例都基于如下表定义: CREATE TABLE test_table( column_char CHAR(3), column_int INT,...
View ArticlePostgreSQL MemoryContext 标准实现解读
背景 PostgreSQL 是多进程架构,它的内存架构可以划分为两大类:共享内存(shared memory area)和本地内存(local memory area)。除了动态申请的共享内存外,绝大多数共享内存是在 Postmaster 启动时分配,具有固定大小,因此内存管理相对简单,不易发生内存泄漏。而每个后端进程还必须管理自己的本地内存来完成请求的处理,这部分的内存管理比较棘手。这是因为...
View Articlepg_repack 插件原理解读
pg_repack 是 PostgreSQL 数据库生态的一款第三方插件,本文将结合 pg_repack 的 源代码 来介绍其原理,而不会介绍如何使用它。如果想了解 pg_repack 的具体用法,可以参考 pg_repack 的 官方文档 或 PolarDB PostgreSQL 版的 pg_repack 文档。 简介 pg_repack 的字面意思是“重新包装”,可以...
View ArticlePostgreSQL blink-tree implement notes
lehman blink-tree and Vladimir Lanin cocurrent Btree PosegreSQL blink-tree 实现方式引用了两个文章 Lehman and Yao’s high-concurrency B-tree management algorithm V. Lanin and D. Shasha, A Symmetric Concurrent...
View ArticlePolarStore弹性内存池(EMP)
本文介绍了PolarStore的弹性内存池(Elastic Memory Pool,简称 EMP)技术,结合高速网络和智能缓存,大幅降低数据读取延迟,提升PolarDB在I/O密集型负载下的性能表现。 背景介绍...
View Article使用PT_PERF排查线上慢SQL问题
背景 在我们线上的客户有一个实例,在每天固定的时间都会出现慢SQL的问题;该用户线上业务对于SQL执行的时间较为严格,执行时间超过150ms就认为是慢SQL。...
View ArticlePostgreSQL 插入常量的合法性检查
本文简单介绍 PostgreSQL 数据库如何对 INSERT 语句中的常量进行合法性检查,检查逻辑从上到下涉及到词法分析、语法解析、语义分析、查询优化、参数绑定、执行器等多个模块。 全文的所有代码都以 PostgreSQL 14 为例,所有 SQL 示例都基于如下表定义: CREATE TABLE test_table( column_char CHAR(3), column_int INT,...
View ArticlePostgreSQL MemoryContext 标准实现解读
背景 PostgreSQL 是多进程架构,它的内存架构可以划分为两大类:共享内存(shared memory area)和本地内存(local memory area)。除了动态申请的共享内存外,绝大多数共享内存是在 Postmaster 启动时分配,具有固定大小,因此内存管理相对简单,不易发生内存泄漏。而每个后端进程还必须管理自己的本地内存来完成请求的处理,这部分的内存管理比较棘手。这是因为...
View Articlepg_repack 插件原理解读
pg_repack 是 PostgreSQL 数据库生态的一款第三方插件,本文将结合 pg_repack 的 源代码 来介绍其原理,而不会介绍如何使用它。如果想了解 pg_repack 的具体用法,可以参考 pg_repack 的 官方文档 或 PolarDB PostgreSQL 版的 pg_repack 文档。 简介 pg_repack 的字面意思是“重新包装”,可以...
View ArticlePostgreSQL blink-tree implement notes
lehman blink-tree and Vladimir Lanin cocurrent Btree PosegreSQL blink-tree 实现方式引用了两个文章 Lehman and Yao’s high-concurrency B-tree management algorithm V. Lanin and D. Shasha, A Symmetric Concurrent...
View ArticlePolarStore弹性内存池(EMP)
本文介绍了PolarStore的弹性内存池(Elastic Memory Pool,简称 EMP)技术,结合高速网络和智能缓存,大幅降低数据读取延迟,提升PolarDB在I/O密集型负载下的性能表现。 背景介绍...
View ArticlePostgreSQL 事件触发器 tag 原理简析
在 PostgreSQL 数据库中,Event Trigger(事件触发器)是一种触发机制,用于响应特定的数据库事件。与常规的 DML 触发器(响应行级别或语句级别操作)不同,事件触发器在 DDL 操作的生命周期中触发,触发时执行用户指定的存储过程或函数,可以用于监控或限制数据库结构的变更。 本文对事件触发器的 tag 这个小特性进行简单的原理分析,文中提到的函数和数据结构来源于...
View ArticleMySQL 单表大数据量下的 B-tree 高度问题
有一些老的DBA 还记得在很早的时候, 坊间流传的是在MySQL里面单表不要超过500万行,单表超过 500 万必须要做分库分表. 有很多 DBA 同学担心MySQL 表大了以后, Btree 高度会变得非常大, 从而影响实例性能. 其实 Btree 是一个非常扁平的 Tree, 绝大部分 Btree 不超过 4 层的, 我们看一下实际情况 我们以常见的 sysbench table 举例子...
View ArticleMysql None-SPJ算子执行流程
背景 作者在polardb下一个版本开发中修复了大量带groupby+rollup集合结果不正确的bug, 顺带抽象总结一下None SPJ算子执行流程,不理解思想的话,单纯通过代码逆向反推逻辑会耗费大量精力,希望本篇文章对于入坑mysql同学有帮助。代码基于版本是mysql 8.4.2。 先抛出一个问题,我们查看一个常见groupby+order by...
View ArticleMySQL Index-Merge代价估算原理
线上高频慢查 在PolarDB-MySQL线上慢查问题中,经常遇到因选中Index-Merge索引反而导致查询更慢的情况,这种情况一般是没有太好的通用解决办法,一般是建议客户针对查询force index来固化某个索引,或者使用NO_INDEX_MERGE 的hint关闭index merge选项。 比如下面一个PolarDB客户的查询(已脱敏),优化器选择了Index...
View Article