<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[dbkernel 的博客]]></title><description><![CDATA[专注于分享数据库技术原理、内核代码分析，主要关注于 MySQL/PostgreSQL/Greenplum/TiDB 等关系型/分布式数据库。]]></description><link>https://blog.csdn.net/dbkernel</link><language>zh-cn</language><generator>https://blog.csdn.net/</generator><copyright><![CDATA[Copyright &copy; dbkernel]]></copyright><item><title><![CDATA[特性介绍 | MySQL生态现有计算下推方案汇总]]></title><link>https://blog.csdn.net/dbkernel/article/details/136803467</link><guid>https://blog.csdn.net/dbkernel/article/details/136803467</guid><author>dbkernel</author><pubDate>Mon, 18 Mar 2024 11:15:09 +0800</pubDate><description><![CDATA[计算下推是数据库优化器优化查询性能的一种常见手段，早期的数据库系统提及的计算下推一般是指谓词下推，其理论源自关系代数理论。2000 年以后，随着 Oracle RAC 的盛行以及一众开源分布式数据库的崛起，存算分离的概念逐步流行，计算下推的涵盖范围由此从基本的谓词+投影下推延伸到了数据库所支持的一切可能计算的下推（JOIN、聚合、完整 query、部分 query 等）。]]></description><category></category></item><item><title><![CDATA[问题分析 | 为什么主库Waiting for semi-sync ACK from slave会阻塞set global super_read_only=ON的执行]]></title><link>https://blog.csdn.net/dbkernel/article/details/136802208</link><guid>https://blog.csdn.net/dbkernel/article/details/136802208</guid><author>dbkernel</author><pubDate>Mon, 18 Mar 2024 10:38:28 +0800</pubDate><description><![CDATA[在 MDL 中 MDL_KEY 按照 namespace+DB+OBJECT_NAME 的方式进行表示，所谓的 namespace 也比较重要，调用 Global_read_lock::lock_global_read_lock 函数的其他位置与事务提交没太大关系，应与此无关。申请的 S 模式的 MDL_key::GLOBAL 锁，查阅手册（二、如果主库执行的是事务型的语句，比如。进程，之后在主库执行的新事务会处于。锁，S 模式，这两种模式是冲突的，状态的事务还未提交，也就未释放。]]></description><category></category></item><item><title><![CDATA[捉虫日记 | MySQL 8.0从库某些情况下记录重放的CREATE TABLE、DROP TABLE语句到慢日志(slow log)]]></title><link>https://blog.csdn.net/dbkernel/article/details/136799255</link><guid>https://blog.csdn.net/dbkernel/article/details/136799255</guid><author>dbkernel</author><pubDate>Mon, 18 Mar 2024 09:44:45 +0800</pubDate><description><![CDATA[当主从复制采用 binlog 的行模式时，如果从库启用 slow_query_log、log_slow_replica_statements 且从库重放 CREATE TABLE、DROP TABLE 时因特殊情况（比如被从库其他 SQL 占用 MDL 锁）执行耗时较长，会被从库记录到慢日志（slow log），而 ALTER TABLE 却不会被记录到慢日志。按照官方的描述，在 binlog_format 是行模式的情况下，即使启用。相关的 Bug Fix，说明该问题官方尚未修复。]]></description><category></category></item><item><title><![CDATA[万字长文 | 业内 MySQL 线程池主流方案详解 - MariaDB/Percona/AliSQL/TXSQL/MySQL企业版]]></title><link>https://blog.csdn.net/dbkernel/article/details/134103594</link><guid>https://blog.csdn.net/dbkernel/article/details/134103594</guid><author>dbkernel</author><pubDate>Sun, 29 Oct 2023 15:45:41 +0800</pubDate><description><![CDATA[MySQL 企业版MariaDBPercona腾讯 TXSQL阿里云 AliSQL功能实现方式插件非插件非插件非插件推测是非插件版本5.5 版本引入5.5 版本引入，10.2 版本完善5.7/8.0是否开源否是是否否动态开关线程池插件式，不支持不支持不支持支持支持优先级处理策略设定高低优先级，且低优先级事件等待一段时间可升为高优先级队列设定高低优先级，且低优先级事件等待一段时间可升为高优先级队列设定高低优先级，且限制每个连接在高优先级队列中的票数。]]></description><category></category></item><item><title><![CDATA[特性介绍 | MySQL测试框架 MTR 系列教程（四）：语法篇]]></title><link>https://blog.csdn.net/dbkernel/article/details/131587196</link><guid>https://blog.csdn.net/dbkernel/article/details/131587196</guid><author>dbkernel</author><pubDate>Thu, 06 Jul 2023 23:23:37 +0800</pubDate><description><![CDATA[作者：卢文双 资深数据库内核研发

以前对 MySQL 测试框架 MTR 的使用，主要集中于 SQL 正确性验证。近期由于工作需要，深入了解了 MTR 的方方面面，发现 MTR 的能力不仅限于此，还支持单元测试、压力测试、代码覆盖率测试、内存错误检测、线程竞争与死锁等功能，因此，本着分享的精神，将其总结成一个系列。

本文是第四篇语法篇。]]></description><category></category></item><item><title><![CDATA[源码分析 | MySQL测试框架 MTR 系列教程（三）：源码篇]]></title><link>https://blog.csdn.net/dbkernel/article/details/131587111</link><guid>https://blog.csdn.net/dbkernel/article/details/131587111</guid><author>dbkernel</author><pubDate>Thu, 06 Jul 2023 23:17:37 +0800</pubDate><description><![CDATA[作者：卢文双 资深数据库内核研发
以前对 MySQL 测试框架 MTR 的使用，主要集中于 SQL 正确性验证。近期由于工作需要，深入了解了 MTR 的方方面面，发现 MTR 的能力不仅限于此，还支持单元测试、压力测试、代码覆盖率测试、内存错误检测、线程竞争与死锁等功能，因此，本着分享的精神，将其总结成一个系列。

本文是第三篇源码篇。]]></description><category></category></item><item><title><![CDATA[特性介绍 | MySQL 测试框架 MTR 系列教程（二）：进阶篇 - 内存/线程/代码覆盖率/单元/压力测试]]></title><link>https://blog.csdn.net/dbkernel/article/details/130548245</link><guid>https://blog.csdn.net/dbkernel/article/details/130548245</guid><author>dbkernel</author><pubDate>Sun, 07 May 2023 21:28:13 +0800</pubDate><description><![CDATA[以前对 MySQL 测试框架 MTR 的使用，主要集中于 SQL 正确性验证。近期由于工作需要，深入了解了 MTR 的方方面面，发现 MTR 的能力不仅限于此，还支持单元测试、压力测试、代码覆盖率测试、内存错误检测、线程竞争与死锁等功能，因此，本着分享的精神，将其总结成一个系列。

主要内容如下：

- 入门篇：工作机制、编译安装、参数、指令示例、推荐用法、添加 case、常见问题、异常调试
- 进阶篇：高阶用法，包括单元测试、压力测试、代码覆盖率测试、内存错误检测、线程竞争与死锁
- 源码篇
- 语法篇]]></description><category></category></item><item><title><![CDATA[特性介绍 | MySQL 测试框架 MTR 系列教程（一）：入门篇]]></title><link>https://blog.csdn.net/dbkernel/article/details/130198202</link><guid>https://blog.csdn.net/dbkernel/article/details/130198202</guid><author>dbkernel</author><pubDate>Mon, 17 Apr 2023 13:42:59 +0800</pubDate><description><![CDATA[作者：卢文双 资深数据库内核研发
以前对 MySQL 测试框架 MTR 的使用，主要集中于 SQL 正确性验证。近期由于工作需要，深入了解了 MTR 的方方面面，发现 MTR 的能力不仅限于此，还支持单元测试、压力测试、代码覆盖率测试、内存错误检测、线程竞争与死锁等功能，因此，本着分享的精神，将其总结成一个系列。

主要内容如下：

入门篇：机制、编译安装、参数、指令、推荐用法、添加 case、异常调试
进阶篇：高阶用法，包括单元测试、压力测试、代码覆盖率测试、内存错误检测、线程竞争与死锁
源码篇
语法篇]]></description><category></category></item><item><title><![CDATA[源码分析 | ClickHouse和他的朋友们（15）Group By 为什么这么快]]></title><link>https://blog.csdn.net/dbkernel/article/details/125726305</link><guid>https://blog.csdn.net/dbkernel/article/details/125726305</guid><author>dbkernel</author><pubDate>Mon, 11 Jul 2022 17:33:29 +0800</pubDate><description><![CDATA[本文首发于 2021-01-26 21:31:12在揭秘 ClickHouse Group By 之前，先聊聊数据库的性能对比测试问题。在虎哥看来，一个“讲武德”的性能对比测试应该提供什么信息呢？首先要尊重客观事实，在什么场景下，x 比 y 快？
其次是为什么 x 会比 y 快？如果以上两条都做到了，还有一点也比较重要： x 的优势可以支撑多久？ 是架构等带来的长期优势，还是一袋烟的优化所得，是否能持续跟上自己的灵魂。如果只是贴几个妖艳的数字，算不上是 benchmark，而是 benchmarket。好了]]></description><category></category></item><item><title><![CDATA[源码分析 | ClickHouse和他的朋友们（14）存储计算分离方案与实现]]></title><link>https://blog.csdn.net/dbkernel/article/details/125726124</link><guid>https://blog.csdn.net/dbkernel/article/details/125726124</guid><author>dbkernel</author><pubDate>Mon, 11 Jul 2022 17:27:46 +0800</pubDate><description><![CDATA[本文首发于 2020-09-21 22:01:12如果多个 ClickHouse server 可以挂载同一份数据(分布式存储等)，并且每个 server 都可写，这样会有什么好处呢？首先，我们可以把副本机制交给分布式存储来保障，上层架构变得简单朴素；其次，clickhouse-server 可以在任意机器上增加、减少，使存储和计算能力得到充分发挥。本文就来探讨一下 ClickHouse 的存储计算分离方案，实现上并不复杂。ClickHouse 运行时数据由两部分组成：内存元数据和磁盘数据。我们先看写流程：]]></description><category></category></item><item><title><![CDATA[源码分析 | ClickHouse和他的朋友们（13）ReplicatedMergeTree表引擎及同步机制]]></title><link>https://blog.csdn.net/dbkernel/article/details/125726033</link><guid>https://blog.csdn.net/dbkernel/article/details/125726033</guid><author>dbkernel</author><pubDate>Mon, 11 Jul 2022 17:23:37 +0800</pubDate><description><![CDATA[本文首发于 2020-09-15 20:15:14在 MySQL 里，为了保证高可用以及数据安全性会采取主从模式，数据通过 binlog 来进行同步。在 ClickHouse 里，我们可以使用 ReplicatedMergeTree 引擎，数据同步通过 zookeeper 完成。本文先从搭建一个多 replica 集群开始，然后一窥底层的机制，简单吃两口。搭建一个 2 replica 测试集群，由于条件有限，这里在同一台物理机上起 clickhouse-server(2个 replica) + zookee]]></description><category></category></item><item><title><![CDATA[源码分析 | ClickHouse和他的朋友们（12）神奇的物化视图(Materialized View)与原理]]></title><link>https://blog.csdn.net/dbkernel/article/details/125725966</link><guid>https://blog.csdn.net/dbkernel/article/details/125725966</guid><author>dbkernel</author><pubDate>Mon, 11 Jul 2022 17:20:36 +0800</pubDate><description><![CDATA[本文首发于 2020-09-03 21:22:14在 ClickHouse 里，物化视图(Materialized View)可以说是一个神奇且强大的东西，用途别具一格。本文从底层机制进行分析，看看 ClickHouse 的 Materalized View 是怎么工作的，以方便更好的使用它。对大部分人来说，物化视图这个概念会比较抽象，物化？视图？。。。为了更好的理解它，我们先看一个场景。假设你是  一个“幸福”的小程序员，某天产品经理有个需求：实时统计每小时视频下载量。用户下载明细表：
计算每小时下载量：]]></description><category></category></item><item><title><![CDATA[源码分析 | ClickHouse和他的朋友们（11）MySQL实时复制之GTID模式]]></title><link>https://blog.csdn.net/dbkernel/article/details/125725885</link><guid>https://blog.csdn.net/dbkernel/article/details/125725885</guid><author>dbkernel</author><pubDate>Mon, 11 Jul 2022 17:18:27 +0800</pubDate><description><![CDATA[本文首发于 2020-08-28 20:40:14MySQL实时复制原理篇几天前 ClickHouse 官方发布了 v20.8.1.4447-testing，这个版本已经包含了 MaterializeMySQL 引擎，实现了 ClickHouse 实时复制 MySQL 数据的能力，感兴趣的朋友可以通过官方安装包来做体验，安装方式参考 https://clickhouse.tech/#quick-start，需要注意的是要选择 testing 分支。MaterializeMySQL 在 v20.8.1.444]]></description><category></category></item><item><title><![CDATA[源码分析 | ClickHouse和他的朋友们（10）MergeTree Write-Ahead Log]]></title><link>https://blog.csdn.net/dbkernel/article/details/125725813</link><guid>https://blog.csdn.net/dbkernel/article/details/125725813</guid><author>dbkernel</author><pubDate>Mon, 11 Jul 2022 17:15:28 +0800</pubDate><description><![CDATA[本文首发于 2020-08-20 19:55:14数据库系统为了提高写入性能，会把数据先写到内存，等“攒”到一定程度后再回写到磁盘，比如 MySQL 的 buffer pool 机制。因为数据先写到内存，为了数据的安全性，我们需要一个 Write-Ahead Log (WAL) 来保证内存数据的安全性。今天我们来看看 ClickHouse 新增的 MergeTreeWriteAheadLog 模块，它到底解决了什么问题。对于 ClickHouse MergeTree 引擎，每次写入(即使１条数据)都会在磁盘]]></description><category></category></item><item><title><![CDATA[源码分析 | ClickHouse和他的朋友们（８）纯手工打造的SQL解析器]]></title><link>https://blog.csdn.net/dbkernel/article/details/125725606</link><guid>https://blog.csdn.net/dbkernel/article/details/125725606</guid><author>dbkernel</author><pubDate>Mon, 11 Jul 2022 17:10:00 +0800</pubDate><description><![CDATA[本文首发于 2020-07-26 21:55:10现实生活中的物品一旦被标记为“纯手工打造”，给人的第一感觉就是“上乘之品”，一个字“贵”，比如北京老布鞋。但是在计算机世界里，如果有人告诉你 ClickHouse 的 SQL 解析器是纯手工打造的，是不是很惊讶！这个问题引起了不少网友的关注，所以本篇聊聊 ClickHouse 的纯手工解析器，看看它们的底层工作机制及优缺点。枯燥先从一个 SQL 开始：
token
首先对 SQL 里的字符逐个做判断，然后根据其关联性做 token 分割：比如连续的 Word]]></description><category></category></item><item><title><![CDATA[源码分析 | ClickHouse和他的朋友们（6）MergeTree存储结构]]></title><link>https://blog.csdn.net/dbkernel/article/details/125725318</link><guid>https://blog.csdn.net/dbkernel/article/details/125725318</guid><author>dbkernel</author><pubDate>Mon, 11 Jul 2022 17:05:42 +0800</pubDate><description><![CDATA[本文首发于 2020-06-30 21:41:12上篇的 存储引擎技术进化与MergeTree 介绍了存储算法的演进。存储引擎是一个数据库的底盘，一定要稳和动力澎湃。接下来我们将一起来探索下 ClickHouse MergeTree 列式存储引擎，解构下这台“跑车”最重要的部件。所有的存储引擎，无论精良与粗制滥造，最终都是要把数据回写到磁盘，来满足存储和索引目的。磁盘文件的构造可以说是算法的物理体现，我们甚至可以通过这些存储结构反推出其算法实现。所以，要想深入了解一个存储引擎，最好的入手点是它的磁盘存储结构]]></description><category></category></item><item><title><![CDATA[源码分析 | ClickHouse和他的朋友们（5）存储引擎技术进化与MergeTree]]></title><link>https://blog.csdn.net/dbkernel/article/details/125711291</link><guid>https://blog.csdn.net/dbkernel/article/details/125711291</guid><author>dbkernel</author><pubDate>Mon, 11 Jul 2022 16:56:37 +0800</pubDate><description><![CDATA[本文首发于 2020-06-22 21:55:1021 世纪的第二个 10 年，虎哥已经在存储引擎一线奋战近 10 年，由于强大的兴趣驱动，这么多年来几乎不放过 arXiv 上与存储相关的每一篇 paper。尤其是看到带有 draft 的 paper 时，有一种乞丐听到“叮当”响时的愉悦。看paper这玩意就像鉴宝，多数是“赝品”，需要你有“鉴真”的本领，否则今天是张三的算法超越xx，明儿又是王二的硬件提升了yy，让你永远跟不上节奏zz，湮灭在这些没有营养的技术垃圾中，浪费大好青春。言归正传，接下来的3篇，]]></description><category></category></item><item><title><![CDATA[源码分析 | ClickHouse和他的朋友们（4）Pipeline处理器和调度器]]></title><link>https://blog.csdn.net/dbkernel/article/details/125711234</link><guid>https://blog.csdn.net/dbkernel/article/details/125711234</guid><author>dbkernel</author><pubDate>Sun, 10 Jul 2022 21:26:02 +0800</pubDate><description><![CDATA[本文首发于 2020-06-12 20:57:10最后更新: 2020-08-15本文谈下 ClickHouse 核心科技：处理器 Processor 和有向无环调度器 DAG Scheduler。这些概念并不是 ClickHouse 首创，感兴趣的同学可以关注下 materialize 的 timely-dataflow，虎哥用 golang 也写过一个原型。拼的是实现细节，正是这些模块的精良设计，才有了 ClickHous e整体的高性能。在传统数据库系统中，一个 Query 处理流程大体是:其中在 P]]></description><category></category></item><item><title><![CDATA[源码分析 | ClickHouse和他的朋友们（3）MySQL Protocol和Write调用栈]]></title><link>https://blog.csdn.net/dbkernel/article/details/125711174</link><guid>https://blog.csdn.net/dbkernel/article/details/125711174</guid><author>dbkernel</author><pubDate>Sun, 10 Jul 2022 21:21:48 +0800</pubDate><description><![CDATA[本文首发于 2020-06-08 19:57:10上篇的MySQL Protocol和Read调用里介绍了 ClickHouse 一条查询语句的调用栈，本文继续介绍写的调用栈，开整。建表:


写入数据：


调用栈分析
1. 获取存储引擎 OutputStream

2. 从 SQL 组装 InputStream
 如何组装成 inputstream 结构呢？
然后
通过 NullAndDoCopyBlockInputStream的 copyData 方法构造出 Block：
3. 组装 OutputSt]]></description><category></category></item><item><title><![CDATA[源码分析 | ClickHouse和他的朋友们（2）MySQL Protocol和Read调用栈]]></title><link>https://blog.csdn.net/dbkernel/article/details/125711017</link><guid>https://blog.csdn.net/dbkernel/article/details/125711017</guid><author>dbkernel</author><pubDate>Sun, 10 Jul 2022 21:17:41 +0800</pubDate><description><![CDATA[本文首发于 2020-06-07 17:17:10作为一个 OLAP 的 DBMS 来说，有2个端非常重要：这样内外互通，多条朋友多条路，以实现“数据”级的编排能力。今天谈的是入口端的 MySQL 协议，也是本系列 ClickHouse 的第一个好朋友，用户可通过 MySQL 客户端或相关 Driver 直接链接到 ClickHouse，进行数据读写等操作。本文通过 MySQL的 Query 请求，借用调用栈来了解下 ClickHouse 的数据读取全过程。入口文件在:
MySQLHandler.cppMy]]></description><category></category></item></channel></rss>