diff --git a/docs/2014/01/10/advanced-programming-in-the-unix-environment-getopt/index.html b/docs/2014/01/10/advanced-programming-in-the-unix-environment-getopt/index.html index adb70358..8c67f7c3 100644 --- a/docs/2014/01/10/advanced-programming-in-the-unix-environment-getopt/index.html +++ b/docs/2014/01/10/advanced-programming-in-the-unix-environment-getopt/index.html @@ -555,7 +555,7 @@

- + diff --git a/docs/2014/03/12/linux-memory-management-parsing/index.html b/docs/2014/03/12/linux-memory-management-parsing/index.html index c41ec29c..a2ddc2fa 100644 --- a/docs/2014/03/12/linux-memory-management-parsing/index.html +++ b/docs/2014/03/12/linux-memory-management-parsing/index.html @@ -572,7 +572,7 @@

  • 特性介绍 | MySQL测试框架 MTR 系列教程(四):语法篇
  • 源码分析 | MySQL测试框架 MTR 系列教程(三):源码篇
  • 业内 MySQL 线程池主流方案详解 - MariaDB/Percona/华为/AliSQL/TXSQL/MySQL企业版
  • 特性介绍 | MySQL 测试框架 MTR 系列教程(二):进阶篇 - 内存/线程/代码覆盖率/单元/压力测试
  • 特性介绍 | MySQL 测试框架 MTR 系列教程(一):入门篇
  • 推荐 | 一体化实时 HTAP 数据库 StoneDB,如何替换 MySQL 并实现近百倍性能提升
  • 技术分享 | 如何为你的代码选择一个合适的开源协议?
  • 源码分析 | ClickHouse和他的朋友们(15)Group By 为什么这么快
  • 源码分析 | ClickHouse和他的朋友们(14)存储计算分离方案与实现
  • 源码分析 | ClickHouse和他的朋友们(13)ReplicatedMergeTree表引擎及同步机制
  • 源码分析 | ClickHouse和他的朋友们(12)神奇的物化视图(Materialized View)与原理
  • 源码分析 | ClickHouse和他的朋友们(11)MySQL实时复制之GTID模式
  • 问题定位 | Peronca Xtrabackup 8.0近日踩坑总结 - xtrabackup 2.4和8.0区别
  • 源码分析 | ClickHouse和他的朋友们(10)MergeTree Write-Ahead Log
  • 源码分析 | ClickHouse和他的朋友们(9)MySQL实时复制与实现
  • 源码分析 | ClickHouse和他的朋友们 (8) 纯手工打造的SQL解析器
  • 源码分析 | ClickHouse和他的朋友们(6)MergeTree存储结构
  • 源码分析 | ClickHouse和他的朋友们(5)存储引擎技术进化与MergeTree
  • 源码分析 | ClickHouse和他的朋友们(4)Pipeline处理器和调度器
  • 源码分析 | ClickHouse和他的朋友们(3)MySQL Protocol和Write调用栈
  • 源码分析 | ClickHouse和他的朋友们(2)MySQL Protocol和Read调用栈
  • 源码分析 | ClickHouse和他的朋友们(1)编译、开发、测试
  • 特性介绍 | MySQL select count(*) 、count(1)、count(列) 详解(1):概念及区别
  • 捉虫日记 | MySQL 5.7.20 try_acquire_lock_impl 异常导致mysql crash
  • 特性介绍 | MySQL 自增列详解(1):自增列概念及使用
  • 引擎特性 | MySQL MEMORY(HEAP) 存储引擎导致 Slave 节点有本地事务
  • 特性介绍 | Linux 操作系统启动流程
  • 实用工具 | Linux 定时任务 crontab 命令详解
  • 特性分析 | GreenPlum 的并行查询优化策略详解
  • 问题定位 | PostgreSQL 报错 requested WAL segment has already been removed
  • 源码分析 | 使用 gcov 和 lcov 测试 PostgreSQL 代码覆盖率
  • 源码分析 | PostgreSQL 回归测试详解
  • 最佳实践 | 源码编译安装配置 Postgres-XC 集群并用 pg_basebackup 配置 Datanode 热备
  • 特性分析 | GreenPlum Primary/Mirror 同步机制
  • 最佳实践 | CentOS 和 Ubuntu 下安装配置 GreenPlum 数据库集群 - 源码 & 安装包
  • 实用工具 | PostgreSQL 数据库压力测试工具 pgbench 使用示例
  • 特性分析 | PostgreSQL Primary/Standby 主备流复制机制
  • 应用案例 | PostgreSQL libpq 网络库接口操作数据库示例
  • 特性介绍 | PostgreSQL 的依赖约束详解 - 系统表 pg_depend & pg_constraint
  • 程序人生 | C 语言编译器对内存空间的分配原则
  • 程序人生 | unix 网络编程之 getaddrinfo 函数详解及使用举例
  • 程序人生 | Linux Daemon 程序设计示例
  • 系统运维 | Ubuntu 下安装配置samba 服务的详细过程
  • 程序人生 | 我的《C陷阱与缺陷》读书笔记
  • 程序人生 | C语言字节对齐问题详解 - 对齐/字节序/位序/网络序等(下)
  • 程序人生 | C语言字节对齐问题详解 - 对齐/字节序/位序/网络序等(上)
  • 程序人生 | Makefile 常用模板 - 静态链接库/动态链接库/可执行文件
  • 程序人生 | UNIX环境高级编程技巧之 du 指令实现
  • 程序人生 | UNIX环境高级编程技巧之 df 指令实现
  • 特性介绍 | Linux 内存管理机制解析
  • 程序人生 | UNIX 环境高级编程技巧之 getopt & getopt_long 使用示例
  • + diff --git a/docs/2014/07/10/advanced-programming-in-the-unix-environment-df/index.html b/docs/2014/07/10/advanced-programming-in-the-unix-environment-df/index.html index 4732c1e9..293c854c 100644 --- a/docs/2014/07/10/advanced-programming-in-the-unix-environment-df/index.html +++ b/docs/2014/07/10/advanced-programming-in-the-unix-environment-df/index.html @@ -531,7 +531,7 @@

    运行 - + diff --git a/docs/2014/07/10/advanced-programming-in-the-unix-environment-du/index.html b/docs/2014/07/10/advanced-programming-in-the-unix-environment-du/index.html index d64bcebf..33deb983 100644 --- a/docs/2014/07/10/advanced-programming-in-the-unix-environment-du/index.html +++ b/docs/2014/07/10/advanced-programming-in-the-unix-environment-du/index.html @@ -531,7 +531,7 @@

    运行 - + diff --git a/docs/2014/07/10/makefile-common-templates/index.html b/docs/2014/07/10/makefile-common-templates/index.html index c17fc411..618c870f 100644 --- a/docs/2014/07/10/makefile-common-templates/index.html +++ b/docs/2014/07/10/makefile-common-templates/index.html @@ -523,7 +523,7 @@

  • 特性介绍 | MySQL测试框架 MTR 系列教程(四):语法篇
  • 源码分析 | MySQL测试框架 MTR 系列教程(三):源码篇
  • 业内 MySQL 线程池主流方案详解 - MariaDB/Percona/华为/AliSQL/TXSQL/MySQL企业版
  • 特性介绍 | MySQL 测试框架 MTR 系列教程(二):进阶篇 - 内存/线程/代码覆盖率/单元/压力测试
  • 特性介绍 | MySQL 测试框架 MTR 系列教程(一):入门篇
  • 推荐 | 一体化实时 HTAP 数据库 StoneDB,如何替换 MySQL 并实现近百倍性能提升
  • 技术分享 | 如何为你的代码选择一个合适的开源协议?
  • 源码分析 | ClickHouse和他的朋友们(15)Group By 为什么这么快
  • 源码分析 | ClickHouse和他的朋友们(14)存储计算分离方案与实现
  • 源码分析 | ClickHouse和他的朋友们(13)ReplicatedMergeTree表引擎及同步机制
  • 源码分析 | ClickHouse和他的朋友们(12)神奇的物化视图(Materialized View)与原理
  • 源码分析 | ClickHouse和他的朋友们(11)MySQL实时复制之GTID模式
  • 问题定位 | Peronca Xtrabackup 8.0近日踩坑总结 - xtrabackup 2.4和8.0区别
  • 源码分析 | ClickHouse和他的朋友们(10)MergeTree Write-Ahead Log
  • 源码分析 | ClickHouse和他的朋友们(9)MySQL实时复制与实现
  • 源码分析 | ClickHouse和他的朋友们 (8) 纯手工打造的SQL解析器
  • 源码分析 | ClickHouse和他的朋友们(6)MergeTree存储结构
  • 源码分析 | ClickHouse和他的朋友们(5)存储引擎技术进化与MergeTree
  • 源码分析 | ClickHouse和他的朋友们(4)Pipeline处理器和调度器
  • 源码分析 | ClickHouse和他的朋友们(3)MySQL Protocol和Write调用栈
  • 源码分析 | ClickHouse和他的朋友们(2)MySQL Protocol和Read调用栈
  • 源码分析 | ClickHouse和他的朋友们(1)编译、开发、测试
  • 特性介绍 | MySQL select count(*) 、count(1)、count(列) 详解(1):概念及区别
  • 捉虫日记 | MySQL 5.7.20 try_acquire_lock_impl 异常导致mysql crash
  • 特性介绍 | MySQL 自增列详解(1):自增列概念及使用
  • 引擎特性 | MySQL MEMORY(HEAP) 存储引擎导致 Slave 节点有本地事务
  • 特性介绍 | Linux 操作系统启动流程
  • 实用工具 | Linux 定时任务 crontab 命令详解
  • 特性分析 | GreenPlum 的并行查询优化策略详解
  • 问题定位 | PostgreSQL 报错 requested WAL segment has already been removed
  • 源码分析 | 使用 gcov 和 lcov 测试 PostgreSQL 代码覆盖率
  • 源码分析 | PostgreSQL 回归测试详解
  • 最佳实践 | 源码编译安装配置 Postgres-XC 集群并用 pg_basebackup 配置 Datanode 热备
  • 特性分析 | GreenPlum Primary/Mirror 同步机制
  • 最佳实践 | CentOS 和 Ubuntu 下安装配置 GreenPlum 数据库集群 - 源码 & 安装包
  • 实用工具 | PostgreSQL 数据库压力测试工具 pgbench 使用示例
  • 特性分析 | PostgreSQL Primary/Standby 主备流复制机制
  • 应用案例 | PostgreSQL libpq 网络库接口操作数据库示例
  • 特性介绍 | PostgreSQL 的依赖约束详解 - 系统表 pg_depend & pg_constraint
  • 程序人生 | C 语言编译器对内存空间的分配原则
  • 程序人生 | unix 网络编程之 getaddrinfo 函数详解及使用举例
  • 程序人生 | Linux Daemon 程序设计示例
  • 系统运维 | Ubuntu 下安装配置samba 服务的详细过程
  • 程序人生 | 我的《C陷阱与缺陷》读书笔记
  • 程序人生 | C语言字节对齐问题详解 - 对齐/字节序/位序/网络序等(下)
  • 程序人生 | C语言字节对齐问题详解 - 对齐/字节序/位序/网络序等(上)
  • 程序人生 | Makefile 常用模板 - 静态链接库/动态链接库/可执行文件
  • 程序人生 | UNIX环境高级编程技巧之 du 指令实现
  • 程序人生 | UNIX环境高级编程技巧之 df 指令实现
  • 特性介绍 | Linux 内存管理机制解析
  • 程序人生 | UNIX 环境高级编程技巧之 getopt & getopt_long 使用示例
  • + diff --git a/docs/2014/07/21/c-language-byte-alignment-problem-in-detail-part-1/index.html b/docs/2014/07/21/c-language-byte-alignment-problem-in-detail-part-1/index.html index 37f067c3..3efb078d 100644 --- a/docs/2014/07/21/c-language-byte-alignment-problem-in-detail-part-1/index.html +++ b/docs/2014/07/21/c-language-byte-alignment-problem-in-detail-part-1/index.html @@ -771,7 +771,7 @@

    5 - + diff --git a/docs/2014/07/21/c-language-byte-alignment-problem-in-detail-part-2/index.html b/docs/2014/07/21/c-language-byte-alignment-problem-in-detail-part-2/index.html index 45d16b98..8a4f83ba 100644 --- a/docs/2014/07/21/c-language-byte-alignment-problem-in-detail-part-2/index.html +++ b/docs/2014/07/21/c-language-byte-alignment-problem-in-detail-part-2/index.html @@ -700,7 +700,7 @@

  • 特性介绍 | MySQL测试框架 MTR 系列教程(四):语法篇
  • 源码分析 | MySQL测试框架 MTR 系列教程(三):源码篇
  • 业内 MySQL 线程池主流方案详解 - MariaDB/Percona/华为/AliSQL/TXSQL/MySQL企业版
  • 特性介绍 | MySQL 测试框架 MTR 系列教程(二):进阶篇 - 内存/线程/代码覆盖率/单元/压力测试
  • 特性介绍 | MySQL 测试框架 MTR 系列教程(一):入门篇
  • 推荐 | 一体化实时 HTAP 数据库 StoneDB,如何替换 MySQL 并实现近百倍性能提升
  • 技术分享 | 如何为你的代码选择一个合适的开源协议?
  • 源码分析 | ClickHouse和他的朋友们(15)Group By 为什么这么快
  • 源码分析 | ClickHouse和他的朋友们(14)存储计算分离方案与实现
  • 源码分析 | ClickHouse和他的朋友们(13)ReplicatedMergeTree表引擎及同步机制
  • 源码分析 | ClickHouse和他的朋友们(12)神奇的物化视图(Materialized View)与原理
  • 源码分析 | ClickHouse和他的朋友们(11)MySQL实时复制之GTID模式
  • 问题定位 | Peronca Xtrabackup 8.0近日踩坑总结 - xtrabackup 2.4和8.0区别
  • 源码分析 | ClickHouse和他的朋友们(10)MergeTree Write-Ahead Log
  • 源码分析 | ClickHouse和他的朋友们(9)MySQL实时复制与实现
  • 源码分析 | ClickHouse和他的朋友们 (8) 纯手工打造的SQL解析器
  • 源码分析 | ClickHouse和他的朋友们(6)MergeTree存储结构
  • 源码分析 | ClickHouse和他的朋友们(5)存储引擎技术进化与MergeTree
  • 源码分析 | ClickHouse和他的朋友们(4)Pipeline处理器和调度器
  • 源码分析 | ClickHouse和他的朋友们(3)MySQL Protocol和Write调用栈
  • 源码分析 | ClickHouse和他的朋友们(2)MySQL Protocol和Read调用栈
  • 源码分析 | ClickHouse和他的朋友们(1)编译、开发、测试
  • 特性介绍 | MySQL select count(*) 、count(1)、count(列) 详解(1):概念及区别
  • 捉虫日记 | MySQL 5.7.20 try_acquire_lock_impl 异常导致mysql crash
  • 特性介绍 | MySQL 自增列详解(1):自增列概念及使用
  • 引擎特性 | MySQL MEMORY(HEAP) 存储引擎导致 Slave 节点有本地事务
  • 特性介绍 | Linux 操作系统启动流程
  • 实用工具 | Linux 定时任务 crontab 命令详解
  • 特性分析 | GreenPlum 的并行查询优化策略详解
  • 问题定位 | PostgreSQL 报错 requested WAL segment has already been removed
  • 源码分析 | 使用 gcov 和 lcov 测试 PostgreSQL 代码覆盖率
  • 源码分析 | PostgreSQL 回归测试详解
  • 最佳实践 | 源码编译安装配置 Postgres-XC 集群并用 pg_basebackup 配置 Datanode 热备
  • 特性分析 | GreenPlum Primary/Mirror 同步机制
  • 最佳实践 | CentOS 和 Ubuntu 下安装配置 GreenPlum 数据库集群 - 源码 & 安装包
  • 实用工具 | PostgreSQL 数据库压力测试工具 pgbench 使用示例
  • 特性分析 | PostgreSQL Primary/Standby 主备流复制机制
  • 应用案例 | PostgreSQL libpq 网络库接口操作数据库示例
  • 特性介绍 | PostgreSQL 的依赖约束详解 - 系统表 pg_depend & pg_constraint
  • 程序人生 | C 语言编译器对内存空间的分配原则
  • 程序人生 | unix 网络编程之 getaddrinfo 函数详解及使用举例
  • 程序人生 | Linux Daemon 程序设计示例
  • 系统运维 | Ubuntu 下安装配置samba 服务的详细过程
  • 程序人生 | 我的《C陷阱与缺陷》读书笔记
  • 程序人生 | C语言字节对齐问题详解 - 对齐/字节序/位序/网络序等(下)
  • 程序人生 | C语言字节对齐问题详解 - 对齐/字节序/位序/网络序等(上)
  • 程序人生 | Makefile 常用模板 - 静态链接库/动态链接库/可执行文件
  • 程序人生 | UNIX环境高级编程技巧之 du 指令实现
  • 程序人生 | UNIX环境高级编程技巧之 df 指令实现
  • 特性介绍 | Linux 内存管理机制解析
  • 程序人生 | UNIX 环境高级编程技巧之 getopt & getopt_long 使用示例
  • + diff --git a/docs/2014/08/04/c-traps-and-pitfalls-reading-notes/index.html b/docs/2014/08/04/c-traps-and-pitfalls-reading-notes/index.html index d236f63a..d1b84e45 100644 --- a/docs/2014/08/04/c-traps-and-pitfalls-reading-notes/index.html +++ b/docs/2014/08/04/c-traps-and-pitfalls-reading-notes/index.html @@ -990,7 +990,7 @@

  • 特性介绍 | MySQL测试框架 MTR 系列教程(四):语法篇
  • 源码分析 | MySQL测试框架 MTR 系列教程(三):源码篇
  • 业内 MySQL 线程池主流方案详解 - MariaDB/Percona/华为/AliSQL/TXSQL/MySQL企业版
  • 特性介绍 | MySQL 测试框架 MTR 系列教程(二):进阶篇 - 内存/线程/代码覆盖率/单元/压力测试
  • 特性介绍 | MySQL 测试框架 MTR 系列教程(一):入门篇
  • 推荐 | 一体化实时 HTAP 数据库 StoneDB,如何替换 MySQL 并实现近百倍性能提升
  • 技术分享 | 如何为你的代码选择一个合适的开源协议?
  • 源码分析 | ClickHouse和他的朋友们(15)Group By 为什么这么快
  • 源码分析 | ClickHouse和他的朋友们(14)存储计算分离方案与实现
  • 源码分析 | ClickHouse和他的朋友们(13)ReplicatedMergeTree表引擎及同步机制
  • 源码分析 | ClickHouse和他的朋友们(12)神奇的物化视图(Materialized View)与原理
  • 源码分析 | ClickHouse和他的朋友们(11)MySQL实时复制之GTID模式
  • 问题定位 | Peronca Xtrabackup 8.0近日踩坑总结 - xtrabackup 2.4和8.0区别
  • 源码分析 | ClickHouse和他的朋友们(10)MergeTree Write-Ahead Log
  • 源码分析 | ClickHouse和他的朋友们(9)MySQL实时复制与实现
  • 源码分析 | ClickHouse和他的朋友们 (8) 纯手工打造的SQL解析器
  • 源码分析 | ClickHouse和他的朋友们(6)MergeTree存储结构
  • 源码分析 | ClickHouse和他的朋友们(5)存储引擎技术进化与MergeTree
  • 源码分析 | ClickHouse和他的朋友们(4)Pipeline处理器和调度器
  • 源码分析 | ClickHouse和他的朋友们(3)MySQL Protocol和Write调用栈
  • 源码分析 | ClickHouse和他的朋友们(2)MySQL Protocol和Read调用栈
  • 源码分析 | ClickHouse和他的朋友们(1)编译、开发、测试
  • 特性介绍 | MySQL select count(*) 、count(1)、count(列) 详解(1):概念及区别
  • 捉虫日记 | MySQL 5.7.20 try_acquire_lock_impl 异常导致mysql crash
  • 特性介绍 | MySQL 自增列详解(1):自增列概念及使用
  • 引擎特性 | MySQL MEMORY(HEAP) 存储引擎导致 Slave 节点有本地事务
  • 特性介绍 | Linux 操作系统启动流程
  • 实用工具 | Linux 定时任务 crontab 命令详解
  • 特性分析 | GreenPlum 的并行查询优化策略详解
  • 问题定位 | PostgreSQL 报错 requested WAL segment has already been removed
  • 源码分析 | 使用 gcov 和 lcov 测试 PostgreSQL 代码覆盖率
  • 源码分析 | PostgreSQL 回归测试详解
  • 最佳实践 | 源码编译安装配置 Postgres-XC 集群并用 pg_basebackup 配置 Datanode 热备
  • 特性分析 | GreenPlum Primary/Mirror 同步机制
  • 最佳实践 | CentOS 和 Ubuntu 下安装配置 GreenPlum 数据库集群 - 源码 & 安装包
  • 实用工具 | PostgreSQL 数据库压力测试工具 pgbench 使用示例
  • 特性分析 | PostgreSQL Primary/Standby 主备流复制机制
  • 应用案例 | PostgreSQL libpq 网络库接口操作数据库示例
  • 特性介绍 | PostgreSQL 的依赖约束详解 - 系统表 pg_depend & pg_constraint
  • 程序人生 | C 语言编译器对内存空间的分配原则
  • 程序人生 | unix 网络编程之 getaddrinfo 函数详解及使用举例
  • 程序人生 | Linux Daemon 程序设计示例
  • 系统运维 | Ubuntu 下安装配置samba 服务的详细过程
  • 程序人生 | 我的《C陷阱与缺陷》读书笔记
  • 程序人生 | C语言字节对齐问题详解 - 对齐/字节序/位序/网络序等(下)
  • 程序人生 | C语言字节对齐问题详解 - 对齐/字节序/位序/网络序等(上)
  • 程序人生 | Makefile 常用模板 - 静态链接库/动态链接库/可执行文件
  • 程序人生 | UNIX环境高级编程技巧之 du 指令实现
  • 程序人生 | UNIX环境高级编程技巧之 df 指令实现
  • 特性介绍 | Linux 内存管理机制解析
  • 程序人生 | UNIX 环境高级编程技巧之 getopt & getopt_long 使用示例
  • + diff --git a/docs/2014/08/05/how-to-install-configure-samba-service-in-ubuntu/index.html b/docs/2014/08/05/how-to-install-configure-samba-service-in-ubuntu/index.html index ea7382b7..9a1d94c0 100644 --- a/docs/2014/08/05/how-to-install-configure-samba-service-in-ubuntu/index.html +++ b/docs/2014/08/05/how-to-install-configure-samba-service-in-ubuntu/index.html @@ -579,7 +579,7 @@

    - + diff --git a/docs/2014/08/08/example-of-linux-daemon-program-design/index.html b/docs/2014/08/08/example-of-linux-daemon-program-design/index.html index 32d94b6d..6195a719 100644 --- a/docs/2014/08/08/example-of-linux-daemon-program-design/index.html +++ b/docs/2014/08/08/example-of-linux-daemon-program-design/index.html @@ -534,7 +534,7 @@

    - + diff --git a/docs/2015/01/03/unix-getaddrinfo-function-detailed-usage/index.html b/docs/2015/01/03/unix-getaddrinfo-function-detailed-usage/index.html index d53eb2ab..1c981f85 100644 --- a/docs/2015/01/03/unix-getaddrinfo-function-detailed-usage/index.html +++ b/docs/2015/01/03/unix-getaddrinfo-function-detailed-usage/index.html @@ -588,7 +588,7 @@

  • 特性介绍 | MySQL测试框架 MTR 系列教程(四):语法篇
  • 源码分析 | MySQL测试框架 MTR 系列教程(三):源码篇
  • 业内 MySQL 线程池主流方案详解 - MariaDB/Percona/华为/AliSQL/TXSQL/MySQL企业版
  • 特性介绍 | MySQL 测试框架 MTR 系列教程(二):进阶篇 - 内存/线程/代码覆盖率/单元/压力测试
  • 特性介绍 | MySQL 测试框架 MTR 系列教程(一):入门篇
  • 推荐 | 一体化实时 HTAP 数据库 StoneDB,如何替换 MySQL 并实现近百倍性能提升
  • 技术分享 | 如何为你的代码选择一个合适的开源协议?
  • 源码分析 | ClickHouse和他的朋友们(15)Group By 为什么这么快
  • 源码分析 | ClickHouse和他的朋友们(14)存储计算分离方案与实现
  • 源码分析 | ClickHouse和他的朋友们(13)ReplicatedMergeTree表引擎及同步机制
  • 源码分析 | ClickHouse和他的朋友们(12)神奇的物化视图(Materialized View)与原理
  • 源码分析 | ClickHouse和他的朋友们(11)MySQL实时复制之GTID模式
  • 问题定位 | Peronca Xtrabackup 8.0近日踩坑总结 - xtrabackup 2.4和8.0区别
  • 源码分析 | ClickHouse和他的朋友们(10)MergeTree Write-Ahead Log
  • 源码分析 | ClickHouse和他的朋友们(9)MySQL实时复制与实现
  • 源码分析 | ClickHouse和他的朋友们 (8) 纯手工打造的SQL解析器
  • 源码分析 | ClickHouse和他的朋友们(6)MergeTree存储结构
  • 源码分析 | ClickHouse和他的朋友们(5)存储引擎技术进化与MergeTree
  • 源码分析 | ClickHouse和他的朋友们(4)Pipeline处理器和调度器
  • 源码分析 | ClickHouse和他的朋友们(3)MySQL Protocol和Write调用栈
  • 源码分析 | ClickHouse和他的朋友们(2)MySQL Protocol和Read调用栈
  • 源码分析 | ClickHouse和他的朋友们(1)编译、开发、测试
  • 特性介绍 | MySQL select count(*) 、count(1)、count(列) 详解(1):概念及区别
  • 捉虫日记 | MySQL 5.7.20 try_acquire_lock_impl 异常导致mysql crash
  • 特性介绍 | MySQL 自增列详解(1):自增列概念及使用
  • 引擎特性 | MySQL MEMORY(HEAP) 存储引擎导致 Slave 节点有本地事务
  • 特性介绍 | Linux 操作系统启动流程
  • 实用工具 | Linux 定时任务 crontab 命令详解
  • 特性分析 | GreenPlum 的并行查询优化策略详解
  • 问题定位 | PostgreSQL 报错 requested WAL segment has already been removed
  • 源码分析 | 使用 gcov 和 lcov 测试 PostgreSQL 代码覆盖率
  • 源码分析 | PostgreSQL 回归测试详解
  • 最佳实践 | 源码编译安装配置 Postgres-XC 集群并用 pg_basebackup 配置 Datanode 热备
  • 特性分析 | GreenPlum Primary/Mirror 同步机制
  • 最佳实践 | CentOS 和 Ubuntu 下安装配置 GreenPlum 数据库集群 - 源码 & 安装包
  • 实用工具 | PostgreSQL 数据库压力测试工具 pgbench 使用示例
  • 特性分析 | PostgreSQL Primary/Standby 主备流复制机制
  • 应用案例 | PostgreSQL libpq 网络库接口操作数据库示例
  • 特性介绍 | PostgreSQL 的依赖约束详解 - 系统表 pg_depend & pg_constraint
  • 程序人生 | C 语言编译器对内存空间的分配原则
  • 程序人生 | unix 网络编程之 getaddrinfo 函数详解及使用举例
  • 程序人生 | Linux Daemon 程序设计示例
  • 系统运维 | Ubuntu 下安装配置samba 服务的详细过程
  • 程序人生 | 我的《C陷阱与缺陷》读书笔记
  • 程序人生 | C语言字节对齐问题详解 - 对齐/字节序/位序/网络序等(下)
  • 程序人生 | C语言字节对齐问题详解 - 对齐/字节序/位序/网络序等(上)
  • 程序人生 | Makefile 常用模板 - 静态链接库/动态链接库/可执行文件
  • 程序人生 | UNIX环境高级编程技巧之 du 指令实现
  • 程序人生 | UNIX环境高级编程技巧之 df 指令实现
  • 特性介绍 | Linux 内存管理机制解析
  • 程序人生 | UNIX 环境高级编程技巧之 getopt & getopt_long 使用示例
  • + diff --git a/docs/2015/05/04/c-compiler-memory-allocation-principles/index.html b/docs/2015/05/04/c-compiler-memory-allocation-principles/index.html index 3aad9c4d..7034c2c6 100644 --- a/docs/2015/05/04/c-compiler-memory-allocation-principles/index.html +++ b/docs/2015/05/04/c-compiler-memory-allocation-principles/index.html @@ -571,7 +571,7 @@

    - + diff --git a/docs/2015/11/04/postgresql-dependency-constraint-details/index.html b/docs/2015/11/04/postgresql-dependency-constraint-details/index.html index a4456760..5a162362 100644 --- a/docs/2015/11/04/postgresql-dependency-constraint-details/index.html +++ b/docs/2015/11/04/postgresql-dependency-constraint-details/index.html @@ -560,7 +560,7 @@

    示例 - + diff --git a/docs/2015/11/12/example-of-postgresql-libpq/index.html b/docs/2015/11/12/example-of-postgresql-libpq/index.html index 6995ada4..a772e841 100644 --- a/docs/2015/11/12/example-of-postgresql-libpq/index.html +++ b/docs/2015/11/12/example-of-postgresql-libpq/index.html @@ -524,7 +524,7 @@

    - + diff --git a/docs/2015/11/21/postgresql-primary-standby-streaming-replication/index.html b/docs/2015/11/21/postgresql-primary-standby-streaming-replication/index.html index 82e04df2..6e352902 100644 --- a/docs/2015/11/21/postgresql-primary-standby-streaming-replication/index.html +++ b/docs/2015/11/21/postgresql-primary-standby-streaming-replication/index.html @@ -556,7 +556,7 @@

  • 特性介绍 | MySQL测试框架 MTR 系列教程(四):语法篇
  • 源码分析 | MySQL测试框架 MTR 系列教程(三):源码篇
  • 业内 MySQL 线程池主流方案详解 - MariaDB/Percona/华为/AliSQL/TXSQL/MySQL企业版
  • 特性介绍 | MySQL 测试框架 MTR 系列教程(二):进阶篇 - 内存/线程/代码覆盖率/单元/压力测试
  • 特性介绍 | MySQL 测试框架 MTR 系列教程(一):入门篇
  • 推荐 | 一体化实时 HTAP 数据库 StoneDB,如何替换 MySQL 并实现近百倍性能提升
  • 技术分享 | 如何为你的代码选择一个合适的开源协议?
  • 源码分析 | ClickHouse和他的朋友们(15)Group By 为什么这么快
  • 源码分析 | ClickHouse和他的朋友们(14)存储计算分离方案与实现
  • 源码分析 | ClickHouse和他的朋友们(13)ReplicatedMergeTree表引擎及同步机制
  • 源码分析 | ClickHouse和他的朋友们(12)神奇的物化视图(Materialized View)与原理
  • 源码分析 | ClickHouse和他的朋友们(11)MySQL实时复制之GTID模式
  • 问题定位 | Peronca Xtrabackup 8.0近日踩坑总结 - xtrabackup 2.4和8.0区别
  • 源码分析 | ClickHouse和他的朋友们(10)MergeTree Write-Ahead Log
  • 源码分析 | ClickHouse和他的朋友们(9)MySQL实时复制与实现
  • 源码分析 | ClickHouse和他的朋友们 (8) 纯手工打造的SQL解析器
  • 源码分析 | ClickHouse和他的朋友们(6)MergeTree存储结构
  • 源码分析 | ClickHouse和他的朋友们(5)存储引擎技术进化与MergeTree
  • 源码分析 | ClickHouse和他的朋友们(4)Pipeline处理器和调度器
  • 源码分析 | ClickHouse和他的朋友们(3)MySQL Protocol和Write调用栈
  • 源码分析 | ClickHouse和他的朋友们(2)MySQL Protocol和Read调用栈
  • 源码分析 | ClickHouse和他的朋友们(1)编译、开发、测试
  • 特性介绍 | MySQL select count(*) 、count(1)、count(列) 详解(1):概念及区别
  • 捉虫日记 | MySQL 5.7.20 try_acquire_lock_impl 异常导致mysql crash
  • 特性介绍 | MySQL 自增列详解(1):自增列概念及使用
  • 引擎特性 | MySQL MEMORY(HEAP) 存储引擎导致 Slave 节点有本地事务
  • 特性介绍 | Linux 操作系统启动流程
  • 实用工具 | Linux 定时任务 crontab 命令详解
  • 特性分析 | GreenPlum 的并行查询优化策略详解
  • 问题定位 | PostgreSQL 报错 requested WAL segment has already been removed
  • 源码分析 | 使用 gcov 和 lcov 测试 PostgreSQL 代码覆盖率
  • 源码分析 | PostgreSQL 回归测试详解
  • 最佳实践 | 源码编译安装配置 Postgres-XC 集群并用 pg_basebackup 配置 Datanode 热备
  • 特性分析 | GreenPlum Primary/Mirror 同步机制
  • 最佳实践 | CentOS 和 Ubuntu 下安装配置 GreenPlum 数据库集群 - 源码 & 安装包
  • 实用工具 | PostgreSQL 数据库压力测试工具 pgbench 使用示例
  • 特性分析 | PostgreSQL Primary/Standby 主备流复制机制
  • 应用案例 | PostgreSQL libpq 网络库接口操作数据库示例
  • 特性介绍 | PostgreSQL 的依赖约束详解 - 系统表 pg_depend & pg_constraint
  • 程序人生 | C 语言编译器对内存空间的分配原则
  • 程序人生 | unix 网络编程之 getaddrinfo 函数详解及使用举例
  • 程序人生 | Linux Daemon 程序设计示例
  • 系统运维 | Ubuntu 下安装配置samba 服务的详细过程
  • 程序人生 | 我的《C陷阱与缺陷》读书笔记
  • 程序人生 | C语言字节对齐问题详解 - 对齐/字节序/位序/网络序等(下)
  • 程序人生 | C语言字节对齐问题详解 - 对齐/字节序/位序/网络序等(上)
  • 程序人生 | Makefile 常用模板 - 静态链接库/动态链接库/可执行文件
  • 程序人生 | UNIX环境高级编程技巧之 du 指令实现
  • 程序人生 | UNIX环境高级编程技巧之 df 指令实现
  • 特性介绍 | Linux 内存管理机制解析
  • 程序人生 | UNIX 环境高级编程技巧之 getopt & getopt_long 使用示例
  • + diff --git a/docs/2015/12/23/example-of-postgresql-pgbench/index.html b/docs/2015/12/23/example-of-postgresql-pgbench/index.html index 0d05ab97..2a1aa388 100644 --- a/docs/2015/12/23/example-of-postgresql-pgbench/index.html +++ b/docs/2015/12/23/example-of-postgresql-pgbench/index.html @@ -560,7 +560,7 @@

    参考 - + diff --git a/docs/2016/01/14/how-to-install-greenplum-on-linux/index.html b/docs/2016/01/14/how-to-install-greenplum-on-linux/index.html index af2d762a..3faa3f84 100644 --- a/docs/2016/01/14/how-to-install-greenplum-on-linux/index.html +++ b/docs/2016/01/14/how-to-install-greenplum-on-linux/index.html @@ -670,7 +670,7 @@

    - + diff --git a/docs/2016/01/21/greenplum-primary-mirror-sync-mechanism/index.html b/docs/2016/01/21/greenplum-primary-mirror-sync-mechanism/index.html index 887b7b66..1ee45dd1 100644 --- a/docs/2016/01/21/greenplum-primary-mirror-sync-mechanism/index.html +++ b/docs/2016/01/21/greenplum-primary-mirror-sync-mechanism/index.html @@ -540,7 +540,7 @@

    总结 - + diff --git a/docs/2016/03/15/how-to-install-postgres-xc-on-linux/index.html b/docs/2016/03/15/how-to-install-postgres-xc-on-linux/index.html index ee9e53fc..a902c255 100644 --- a/docs/2016/03/15/how-to-install-postgres-xc-on-linux/index.html +++ b/docs/2016/03/15/how-to-install-postgres-xc-on-linux/index.html @@ -604,7 +604,7 @@

    补充 - + diff --git a/docs/2016/03/30/postgresql-regression-test-details/index.html b/docs/2016/03/30/postgresql-regression-test-details/index.html index e8bbe87a..447f692f 100644 --- a/docs/2016/03/30/postgresql-regression-test-details/index.html +++ b/docs/2016/03/30/postgresql-regression-test-details/index.html @@ -628,7 +628,7 @@

    参考 - + diff --git a/docs/2016/03/30/test-postgresql-code-coverage-using-gcov-and-lcov/index.html b/docs/2016/03/30/test-postgresql-code-coverage-using-gcov-and-lcov/index.html index 60437c4d..556b6180 100644 --- a/docs/2016/03/30/test-postgresql-code-coverage-using-gcov-and-lcov/index.html +++ b/docs/2016/03/30/test-postgresql-code-coverage-using-gcov-and-lcov/index.html @@ -582,7 +582,7 @@

  • 特性介绍 | MySQL测试框架 MTR 系列教程(四):语法篇
  • 源码分析 | MySQL测试框架 MTR 系列教程(三):源码篇
  • 业内 MySQL 线程池主流方案详解 - MariaDB/Percona/华为/AliSQL/TXSQL/MySQL企业版
  • 特性介绍 | MySQL 测试框架 MTR 系列教程(二):进阶篇 - 内存/线程/代码覆盖率/单元/压力测试
  • 特性介绍 | MySQL 测试框架 MTR 系列教程(一):入门篇
  • 推荐 | 一体化实时 HTAP 数据库 StoneDB,如何替换 MySQL 并实现近百倍性能提升
  • 技术分享 | 如何为你的代码选择一个合适的开源协议?
  • 源码分析 | ClickHouse和他的朋友们(15)Group By 为什么这么快
  • 源码分析 | ClickHouse和他的朋友们(14)存储计算分离方案与实现
  • 源码分析 | ClickHouse和他的朋友们(13)ReplicatedMergeTree表引擎及同步机制
  • 源码分析 | ClickHouse和他的朋友们(12)神奇的物化视图(Materialized View)与原理
  • 源码分析 | ClickHouse和他的朋友们(11)MySQL实时复制之GTID模式
  • 问题定位 | Peronca Xtrabackup 8.0近日踩坑总结 - xtrabackup 2.4和8.0区别
  • 源码分析 | ClickHouse和他的朋友们(10)MergeTree Write-Ahead Log
  • 源码分析 | ClickHouse和他的朋友们(9)MySQL实时复制与实现
  • 源码分析 | ClickHouse和他的朋友们 (8) 纯手工打造的SQL解析器
  • 源码分析 | ClickHouse和他的朋友们(6)MergeTree存储结构
  • 源码分析 | ClickHouse和他的朋友们(5)存储引擎技术进化与MergeTree
  • 源码分析 | ClickHouse和他的朋友们(4)Pipeline处理器和调度器
  • 源码分析 | ClickHouse和他的朋友们(3)MySQL Protocol和Write调用栈
  • 源码分析 | ClickHouse和他的朋友们(2)MySQL Protocol和Read调用栈
  • 源码分析 | ClickHouse和他的朋友们(1)编译、开发、测试
  • 特性介绍 | MySQL select count(*) 、count(1)、count(列) 详解(1):概念及区别
  • 捉虫日记 | MySQL 5.7.20 try_acquire_lock_impl 异常导致mysql crash
  • 特性介绍 | MySQL 自增列详解(1):自增列概念及使用
  • 引擎特性 | MySQL MEMORY(HEAP) 存储引擎导致 Slave 节点有本地事务
  • 特性介绍 | Linux 操作系统启动流程
  • 实用工具 | Linux 定时任务 crontab 命令详解
  • 特性分析 | GreenPlum 的并行查询优化策略详解
  • 问题定位 | PostgreSQL 报错 requested WAL segment has already been removed
  • 源码分析 | 使用 gcov 和 lcov 测试 PostgreSQL 代码覆盖率
  • 源码分析 | PostgreSQL 回归测试详解
  • 最佳实践 | 源码编译安装配置 Postgres-XC 集群并用 pg_basebackup 配置 Datanode 热备
  • 特性分析 | GreenPlum Primary/Mirror 同步机制
  • 最佳实践 | CentOS 和 Ubuntu 下安装配置 GreenPlum 数据库集群 - 源码 & 安装包
  • 实用工具 | PostgreSQL 数据库压力测试工具 pgbench 使用示例
  • 特性分析 | PostgreSQL Primary/Standby 主备流复制机制
  • 应用案例 | PostgreSQL libpq 网络库接口操作数据库示例
  • 特性介绍 | PostgreSQL 的依赖约束详解 - 系统表 pg_depend & pg_constraint
  • 程序人生 | C 语言编译器对内存空间的分配原则
  • 程序人生 | unix 网络编程之 getaddrinfo 函数详解及使用举例
  • 程序人生 | Linux Daemon 程序设计示例
  • 系统运维 | Ubuntu 下安装配置samba 服务的详细过程
  • 程序人生 | 我的《C陷阱与缺陷》读书笔记
  • 程序人生 | C语言字节对齐问题详解 - 对齐/字节序/位序/网络序等(下)
  • 程序人生 | C语言字节对齐问题详解 - 对齐/字节序/位序/网络序等(上)
  • 程序人生 | Makefile 常用模板 - 静态链接库/动态链接库/可执行文件
  • 程序人生 | UNIX环境高级编程技巧之 du 指令实现
  • 程序人生 | UNIX环境高级编程技巧之 df 指令实现
  • 特性介绍 | Linux 内存管理机制解析
  • 程序人生 | UNIX 环境高级编程技巧之 getopt & getopt_long 使用示例
  • + diff --git a/docs/2016/04/25/postgresql-error-wal-segment-has-already-been-removed/index.html b/docs/2016/04/25/postgresql-error-wal-segment-has-already-been-removed/index.html index b29f8689..a9287531 100644 --- a/docs/2016/04/25/postgresql-error-wal-segment-has-already-been-removed/index.html +++ b/docs/2016/04/25/postgresql-error-wal-segment-has-already-been-removed/index.html @@ -562,7 +562,7 @@

    参考 - + diff --git a/docs/2016/11/21/greenplum-parallel-query-optimization-strategy/index.html b/docs/2016/11/21/greenplum-parallel-query-optimization-strategy/index.html index 4421bf24..850c29eb 100644 --- a/docs/2016/11/21/greenplum-parallel-query-optimization-strategy/index.html +++ b/docs/2016/11/21/greenplum-parallel-query-optimization-strategy/index.html @@ -577,7 +577,7 @@

    总结 - + diff --git a/docs/2016/11/23/description-of-the-crontab-command/index.html b/docs/2016/11/23/description-of-the-crontab-command/index.html index c0e1e31e..f0ee84fe 100644 --- a/docs/2016/11/23/description-of-the-crontab-command/index.html +++ b/docs/2016/11/23/description-of-the-crontab-command/index.html @@ -632,7 +632,7 @@

    - + diff --git a/docs/2018/09/16/process-for-starting-the-linux-os/index.html b/docs/2018/09/16/process-for-starting-the-linux-os/index.html index 6ef67123..7f58907c 100644 --- a/docs/2018/09/16/process-for-starting-the-linux-os/index.html +++ b/docs/2018/09/16/process-for-starting-the-linux-os/index.html @@ -639,7 +639,7 @@

  • 特性介绍 | MySQL测试框架 MTR 系列教程(四):语法篇
  • 源码分析 | MySQL测试框架 MTR 系列教程(三):源码篇
  • 业内 MySQL 线程池主流方案详解 - MariaDB/Percona/华为/AliSQL/TXSQL/MySQL企业版
  • 特性介绍 | MySQL 测试框架 MTR 系列教程(二):进阶篇 - 内存/线程/代码覆盖率/单元/压力测试
  • 特性介绍 | MySQL 测试框架 MTR 系列教程(一):入门篇
  • 推荐 | 一体化实时 HTAP 数据库 StoneDB,如何替换 MySQL 并实现近百倍性能提升
  • 技术分享 | 如何为你的代码选择一个合适的开源协议?
  • 源码分析 | ClickHouse和他的朋友们(15)Group By 为什么这么快
  • 源码分析 | ClickHouse和他的朋友们(14)存储计算分离方案与实现
  • 源码分析 | ClickHouse和他的朋友们(13)ReplicatedMergeTree表引擎及同步机制
  • 源码分析 | ClickHouse和他的朋友们(12)神奇的物化视图(Materialized View)与原理
  • 源码分析 | ClickHouse和他的朋友们(11)MySQL实时复制之GTID模式
  • 问题定位 | Peronca Xtrabackup 8.0近日踩坑总结 - xtrabackup 2.4和8.0区别
  • 源码分析 | ClickHouse和他的朋友们(10)MergeTree Write-Ahead Log
  • 源码分析 | ClickHouse和他的朋友们(9)MySQL实时复制与实现
  • 源码分析 | ClickHouse和他的朋友们 (8) 纯手工打造的SQL解析器
  • 源码分析 | ClickHouse和他的朋友们(6)MergeTree存储结构
  • 源码分析 | ClickHouse和他的朋友们(5)存储引擎技术进化与MergeTree
  • 源码分析 | ClickHouse和他的朋友们(4)Pipeline处理器和调度器
  • 源码分析 | ClickHouse和他的朋友们(3)MySQL Protocol和Write调用栈
  • 源码分析 | ClickHouse和他的朋友们(2)MySQL Protocol和Read调用栈
  • 源码分析 | ClickHouse和他的朋友们(1)编译、开发、测试
  • 特性介绍 | MySQL select count(*) 、count(1)、count(列) 详解(1):概念及区别
  • 捉虫日记 | MySQL 5.7.20 try_acquire_lock_impl 异常导致mysql crash
  • 特性介绍 | MySQL 自增列详解(1):自增列概念及使用
  • 引擎特性 | MySQL MEMORY(HEAP) 存储引擎导致 Slave 节点有本地事务
  • 特性介绍 | Linux 操作系统启动流程
  • 实用工具 | Linux 定时任务 crontab 命令详解
  • 特性分析 | GreenPlum 的并行查询优化策略详解
  • 问题定位 | PostgreSQL 报错 requested WAL segment has already been removed
  • 源码分析 | 使用 gcov 和 lcov 测试 PostgreSQL 代码覆盖率
  • 源码分析 | PostgreSQL 回归测试详解
  • 最佳实践 | 源码编译安装配置 Postgres-XC 集群并用 pg_basebackup 配置 Datanode 热备
  • 特性分析 | GreenPlum Primary/Mirror 同步机制
  • 最佳实践 | CentOS 和 Ubuntu 下安装配置 GreenPlum 数据库集群 - 源码 & 安装包
  • 实用工具 | PostgreSQL 数据库压力测试工具 pgbench 使用示例
  • 特性分析 | PostgreSQL Primary/Standby 主备流复制机制
  • 应用案例 | PostgreSQL libpq 网络库接口操作数据库示例
  • 特性介绍 | PostgreSQL 的依赖约束详解 - 系统表 pg_depend & pg_constraint
  • 程序人生 | C 语言编译器对内存空间的分配原则
  • 程序人生 | unix 网络编程之 getaddrinfo 函数详解及使用举例
  • 程序人生 | Linux Daemon 程序设计示例
  • 系统运维 | Ubuntu 下安装配置samba 服务的详细过程
  • 程序人生 | 我的《C陷阱与缺陷》读书笔记
  • 程序人生 | C语言字节对齐问题详解 - 对齐/字节序/位序/网络序等(下)
  • 程序人生 | C语言字节对齐问题详解 - 对齐/字节序/位序/网络序等(上)
  • 程序人生 | Makefile 常用模板 - 静态链接库/动态链接库/可执行文件
  • 程序人生 | UNIX环境高级编程技巧之 du 指令实现
  • 程序人生 | UNIX环境高级编程技巧之 df 指令实现
  • 特性介绍 | Linux 内存管理机制解析
  • 程序人生 | UNIX 环境高级编程技巧之 getopt & getopt_long 使用示例
  • + diff --git a/docs/2019/04/22/mysql-memory-engine-slave-has-local-transactions/index.html b/docs/2019/04/22/mysql-memory-engine-slave-has-local-transactions/index.html index a6ff99c3..ee840e12 100644 --- a/docs/2019/04/22/mysql-memory-engine-slave-has-local-transactions/index.html +++ b/docs/2019/04/22/mysql-memory-engine-slave-has-local-transactions/index.html @@ -613,7 +613,7 @@

    - + diff --git a/docs/2019/12/09/mysql-auto_increment-details-01-concepts-and-usage/index.html b/docs/2019/12/09/mysql-auto_increment-details-01-concepts-and-usage/index.html index 4e37c946..b51cbd57 100644 --- a/docs/2019/12/09/mysql-auto_increment-details-01-concepts-and-usage/index.html +++ b/docs/2019/12/09/mysql-auto_increment-details-01-concepts-and-usage/index.html @@ -622,7 +622,7 @@

    4 - + diff --git a/docs/2020/05/06/mysql-select-count-functions-01-concepts-and-differences/index.html b/docs/2020/05/06/mysql-select-count-functions-01-concepts-and-differences/index.html index a4910707..27539544 100644 --- a/docs/2020/05/06/mysql-select-count-functions-01-concepts-and-differences/index.html +++ b/docs/2020/05/06/mysql-select-count-functions-01-concepts-and-differences/index.html @@ -565,7 +565,7 @@

  • 特性介绍 | MySQL测试框架 MTR 系列教程(四):语法篇
  • 源码分析 | MySQL测试框架 MTR 系列教程(三):源码篇
  • 业内 MySQL 线程池主流方案详解 - MariaDB/Percona/华为/AliSQL/TXSQL/MySQL企业版
  • 特性介绍 | MySQL 测试框架 MTR 系列教程(二):进阶篇 - 内存/线程/代码覆盖率/单元/压力测试
  • 特性介绍 | MySQL 测试框架 MTR 系列教程(一):入门篇
  • 推荐 | 一体化实时 HTAP 数据库 StoneDB,如何替换 MySQL 并实现近百倍性能提升
  • 技术分享 | 如何为你的代码选择一个合适的开源协议?
  • 源码分析 | ClickHouse和他的朋友们(15)Group By 为什么这么快
  • 源码分析 | ClickHouse和他的朋友们(14)存储计算分离方案与实现
  • 源码分析 | ClickHouse和他的朋友们(13)ReplicatedMergeTree表引擎及同步机制
  • 源码分析 | ClickHouse和他的朋友们(12)神奇的物化视图(Materialized View)与原理
  • 源码分析 | ClickHouse和他的朋友们(11)MySQL实时复制之GTID模式
  • 问题定位 | Peronca Xtrabackup 8.0近日踩坑总结 - xtrabackup 2.4和8.0区别
  • 源码分析 | ClickHouse和他的朋友们(10)MergeTree Write-Ahead Log
  • 源码分析 | ClickHouse和他的朋友们(9)MySQL实时复制与实现
  • 源码分析 | ClickHouse和他的朋友们 (8) 纯手工打造的SQL解析器
  • 源码分析 | ClickHouse和他的朋友们(6)MergeTree存储结构
  • 源码分析 | ClickHouse和他的朋友们(5)存储引擎技术进化与MergeTree
  • 源码分析 | ClickHouse和他的朋友们(4)Pipeline处理器和调度器
  • 源码分析 | ClickHouse和他的朋友们(3)MySQL Protocol和Write调用栈
  • 源码分析 | ClickHouse和他的朋友们(2)MySQL Protocol和Read调用栈
  • 源码分析 | ClickHouse和他的朋友们(1)编译、开发、测试
  • 特性介绍 | MySQL select count(*) 、count(1)、count(列) 详解(1):概念及区别
  • 捉虫日记 | MySQL 5.7.20 try_acquire_lock_impl 异常导致mysql crash
  • 特性介绍 | MySQL 自增列详解(1):自增列概念及使用
  • 引擎特性 | MySQL MEMORY(HEAP) 存储引擎导致 Slave 节点有本地事务
  • 特性介绍 | Linux 操作系统启动流程
  • 实用工具 | Linux 定时任务 crontab 命令详解
  • 特性分析 | GreenPlum 的并行查询优化策略详解
  • 问题定位 | PostgreSQL 报错 requested WAL segment has already been removed
  • 源码分析 | 使用 gcov 和 lcov 测试 PostgreSQL 代码覆盖率
  • 源码分析 | PostgreSQL 回归测试详解
  • 最佳实践 | 源码编译安装配置 Postgres-XC 集群并用 pg_basebackup 配置 Datanode 热备
  • 特性分析 | GreenPlum Primary/Mirror 同步机制
  • 最佳实践 | CentOS 和 Ubuntu 下安装配置 GreenPlum 数据库集群 - 源码 & 安装包
  • 实用工具 | PostgreSQL 数据库压力测试工具 pgbench 使用示例
  • 特性分析 | PostgreSQL Primary/Standby 主备流复制机制
  • 应用案例 | PostgreSQL libpq 网络库接口操作数据库示例
  • 特性介绍 | PostgreSQL 的依赖约束详解 - 系统表 pg_depend & pg_constraint
  • 程序人生 | C 语言编译器对内存空间的分配原则
  • 程序人生 | unix 网络编程之 getaddrinfo 函数详解及使用举例
  • 程序人生 | Linux Daemon 程序设计示例
  • 系统运维 | Ubuntu 下安装配置samba 服务的详细过程
  • 程序人生 | 我的《C陷阱与缺陷》读书笔记
  • 程序人生 | C语言字节对齐问题详解 - 对齐/字节序/位序/网络序等(下)
  • 程序人生 | C语言字节对齐问题详解 - 对齐/字节序/位序/网络序等(上)
  • 程序人生 | Makefile 常用模板 - 静态链接库/动态链接库/可执行文件
  • 程序人生 | UNIX环境高级编程技巧之 du 指令实现
  • 程序人生 | UNIX环境高级编程技巧之 df 指令实现
  • 特性介绍 | Linux 内存管理机制解析
  • 程序人生 | UNIX 环境高级编程技巧之 getopt & getopt_long 使用示例
  • + diff --git a/docs/2020/05/06/mysql-try_acquire_lock_impl-crash-in-5720/index.html b/docs/2020/05/06/mysql-try_acquire_lock_impl-crash-in-5720/index.html index 38c5fa32..d5040519 100644 --- a/docs/2020/05/06/mysql-try_acquire_lock_impl-crash-in-5720/index.html +++ b/docs/2020/05/06/mysql-try_acquire_lock_impl-crash-in-5720/index.html @@ -506,7 +506,7 @@

    解决 - + diff --git a/docs/2020/06/05/clickhouse-and-friends-01-development/index.html b/docs/2020/06/05/clickhouse-and-friends-01-development/index.html index 22ef11e5..be9d6604 100644 --- a/docs/2020/06/05/clickhouse-and-friends-01-development/index.html +++ b/docs/2020/06/05/clickhouse-and-friends-01-development/index.html @@ -555,7 +555,7 @@

  • 特性介绍 | MySQL测试框架 MTR 系列教程(四):语法篇
  • 源码分析 | MySQL测试框架 MTR 系列教程(三):源码篇
  • 业内 MySQL 线程池主流方案详解 - MariaDB/Percona/华为/AliSQL/TXSQL/MySQL企业版
  • 特性介绍 | MySQL 测试框架 MTR 系列教程(二):进阶篇 - 内存/线程/代码覆盖率/单元/压力测试
  • 特性介绍 | MySQL 测试框架 MTR 系列教程(一):入门篇
  • 推荐 | 一体化实时 HTAP 数据库 StoneDB,如何替换 MySQL 并实现近百倍性能提升
  • 技术分享 | 如何为你的代码选择一个合适的开源协议?
  • 源码分析 | ClickHouse和他的朋友们(15)Group By 为什么这么快
  • 源码分析 | ClickHouse和他的朋友们(14)存储计算分离方案与实现
  • 源码分析 | ClickHouse和他的朋友们(13)ReplicatedMergeTree表引擎及同步机制
  • 源码分析 | ClickHouse和他的朋友们(12)神奇的物化视图(Materialized View)与原理
  • 源码分析 | ClickHouse和他的朋友们(11)MySQL实时复制之GTID模式
  • 问题定位 | Peronca Xtrabackup 8.0近日踩坑总结 - xtrabackup 2.4和8.0区别
  • 源码分析 | ClickHouse和他的朋友们(10)MergeTree Write-Ahead Log
  • 源码分析 | ClickHouse和他的朋友们(9)MySQL实时复制与实现
  • 源码分析 | ClickHouse和他的朋友们 (8) 纯手工打造的SQL解析器
  • 源码分析 | ClickHouse和他的朋友们(6)MergeTree存储结构
  • 源码分析 | ClickHouse和他的朋友们(5)存储引擎技术进化与MergeTree
  • 源码分析 | ClickHouse和他的朋友们(4)Pipeline处理器和调度器
  • 源码分析 | ClickHouse和他的朋友们(3)MySQL Protocol和Write调用栈
  • 源码分析 | ClickHouse和他的朋友们(2)MySQL Protocol和Read调用栈
  • 源码分析 | ClickHouse和他的朋友们(1)编译、开发、测试
  • 特性介绍 | MySQL select count(*) 、count(1)、count(列) 详解(1):概念及区别
  • 捉虫日记 | MySQL 5.7.20 try_acquire_lock_impl 异常导致mysql crash
  • 特性介绍 | MySQL 自增列详解(1):自增列概念及使用
  • 引擎特性 | MySQL MEMORY(HEAP) 存储引擎导致 Slave 节点有本地事务
  • 特性介绍 | Linux 操作系统启动流程
  • 实用工具 | Linux 定时任务 crontab 命令详解
  • 特性分析 | GreenPlum 的并行查询优化策略详解
  • 问题定位 | PostgreSQL 报错 requested WAL segment has already been removed
  • 源码分析 | 使用 gcov 和 lcov 测试 PostgreSQL 代码覆盖率
  • 源码分析 | PostgreSQL 回归测试详解
  • 最佳实践 | 源码编译安装配置 Postgres-XC 集群并用 pg_basebackup 配置 Datanode 热备
  • 特性分析 | GreenPlum Primary/Mirror 同步机制
  • 最佳实践 | CentOS 和 Ubuntu 下安装配置 GreenPlum 数据库集群 - 源码 & 安装包
  • 实用工具 | PostgreSQL 数据库压力测试工具 pgbench 使用示例
  • 特性分析 | PostgreSQL Primary/Standby 主备流复制机制
  • 应用案例 | PostgreSQL libpq 网络库接口操作数据库示例
  • 特性介绍 | PostgreSQL 的依赖约束详解 - 系统表 pg_depend & pg_constraint
  • 程序人生 | C 语言编译器对内存空间的分配原则
  • 程序人生 | unix 网络编程之 getaddrinfo 函数详解及使用举例
  • 程序人生 | Linux Daemon 程序设计示例
  • 系统运维 | Ubuntu 下安装配置samba 服务的详细过程
  • 程序人生 | 我的《C陷阱与缺陷》读书笔记
  • 程序人生 | C语言字节对齐问题详解 - 对齐/字节序/位序/网络序等(下)
  • 程序人生 | C语言字节对齐问题详解 - 对齐/字节序/位序/网络序等(上)
  • 程序人生 | Makefile 常用模板 - 静态链接库/动态链接库/可执行文件
  • 程序人生 | UNIX环境高级编程技巧之 du 指令实现
  • 程序人生 | UNIX环境高级编程技巧之 df 指令实现
  • 特性介绍 | Linux 内存管理机制解析
  • 程序人生 | UNIX 环境高级编程技巧之 getopt & getopt_long 使用示例
  • + diff --git a/docs/2020/06/07/clickhouse-and-friends-02-mysql-protocol-read-stack/index.html b/docs/2020/06/07/clickhouse-and-friends-02-mysql-protocol-read-stack/index.html index 355dbc53..a489e7fc 100644 --- a/docs/2020/06/07/clickhouse-and-friends-02-mysql-protocol-read-stack/index.html +++ b/docs/2020/06/07/clickhouse-and-friends-02-mysql-protocol-read-stack/index.html @@ -577,7 +577,7 @@

    - + diff --git a/docs/2020/06/08/clickhouse-and-friends-03-mysql-protocol-write-stack/index.html b/docs/2020/06/08/clickhouse-and-friends-03-mysql-protocol-write-stack/index.html index 719e83fc..d2597c5b 100644 --- a/docs/2020/06/08/clickhouse-and-friends-03-mysql-protocol-write-stack/index.html +++ b/docs/2020/06/08/clickhouse-and-friends-03-mysql-protocol-write-stack/index.html @@ -559,7 +559,7 @@

    - + diff --git a/docs/2020/06/12/clickhouse-and-friends-04-processor/index.html b/docs/2020/06/12/clickhouse-and-friends-04-processor/index.html index d7be3d2c..167cf47e 100644 --- a/docs/2020/06/12/clickhouse-and-friends-04-processor/index.html +++ b/docs/2020/06/12/clickhouse-and-friends-04-processor/index.html @@ -584,7 +584,7 @@

    总结 - + diff --git a/docs/2020/06/22/clickhouse-and-friends-05-merge-tree-algo/index.html b/docs/2020/06/22/clickhouse-and-friends-05-merge-tree-algo/index.html index 21e194e8..1437b9c9 100644 --- a/docs/2020/06/22/clickhouse-and-friends-05-merge-tree-algo/index.html +++ b/docs/2020/06/22/clickhouse-and-friends-05-merge-tree-algo/index.html @@ -638,7 +638,7 @@

    - + diff --git a/docs/2020/06/30/clickhouse-and-friends-06-merge-tree-disk-layout/index.html b/docs/2020/06/30/clickhouse-and-friends-06-merge-tree-disk-layout/index.html index ef62bd85..29e3816c 100644 --- a/docs/2020/06/30/clickhouse-and-friends-06-merge-tree-disk-layout/index.html +++ b/docs/2020/06/30/clickhouse-and-friends-06-merge-tree-disk-layout/index.html @@ -618,7 +618,7 @@

    总结 - + diff --git a/docs/2020/07/26/clickhouse-and-friends-08-parser/index.html b/docs/2020/07/26/clickhouse-and-friends-08-parser/index.html index d7c9010f..99c94a72 100644 --- a/docs/2020/07/26/clickhouse-and-friends-08-parser/index.html +++ b/docs/2020/07/26/clickhouse-and-friends-08-parser/index.html @@ -571,7 +571,7 @@

    总结 - + diff --git a/docs/2020/07/28/clickhouse-and-friends-09-mysql-replication/index.html b/docs/2020/07/28/clickhouse-and-friends-09-mysql-replication/index.html index afee16d8..c07c8ec8 100644 --- a/docs/2020/07/28/clickhouse-and-friends-09-mysql-replication/index.html +++ b/docs/2020/07/28/clickhouse-and-friends-09-mysql-replication/index.html @@ -664,7 +664,7 @@

    总结 - + diff --git a/docs/2020/08/20/clickhouse-and-friends-10-merge-tree-wal/index.html b/docs/2020/08/20/clickhouse-and-friends-10-merge-tree-wal/index.html index ced7d263..782e9603 100644 --- a/docs/2020/08/20/clickhouse-and-friends-10-merge-tree-wal/index.html +++ b/docs/2020/08/20/clickhouse-and-friends-10-merge-tree-wal/index.html @@ -551,7 +551,7 @@

    总结 - + diff --git a/docs/2020/08/27/percona-xtrabackup-2.4-vs-8.0/index.html b/docs/2020/08/27/percona-xtrabackup-2.4-vs-8.0/index.html index 253a1807..910db437 100644 --- a/docs/2020/08/27/percona-xtrabackup-2.4-vs-8.0/index.html +++ b/docs/2020/08/27/percona-xtrabackup-2.4-vs-8.0/index.html @@ -630,7 +630,7 @@

    总结 - + diff --git a/docs/2020/08/28/clickhouse-and-friends-11-mysql-gtid-replication/index.html b/docs/2020/08/28/clickhouse-and-friends-11-mysql-gtid-replication/index.html index 99bb630a..069458c8 100644 --- a/docs/2020/08/28/clickhouse-and-friends-11-mysql-gtid-replication/index.html +++ b/docs/2020/08/28/clickhouse-and-friends-11-mysql-gtid-replication/index.html @@ -557,7 +557,7 @@

    总结 - + diff --git a/docs/2020/09/03/clickhouse-and-friends-12-materialized-view/index.html b/docs/2020/09/03/clickhouse-and-friends-12-materialized-view/index.html index fba1efeb..18ec3eab 100644 --- a/docs/2020/09/03/clickhouse-and-friends-12-materialized-view/index.html +++ b/docs/2020/09/03/clickhouse-and-friends-12-materialized-view/index.html @@ -584,7 +584,7 @@

    总结 - + diff --git a/docs/2020/09/15/clickhouse-and-friends-13-replicated-merge-tree/index.html b/docs/2020/09/15/clickhouse-and-friends-13-replicated-merge-tree/index.html index 05799d0e..418a1723 100644 --- a/docs/2020/09/15/clickhouse-and-friends-13-replicated-merge-tree/index.html +++ b/docs/2020/09/15/clickhouse-and-friends-13-replicated-merge-tree/index.html @@ -555,7 +555,7 @@

    4 - + diff --git a/docs/2020/09/21/clickhouse-and-friends-14-compute-storage/index.html b/docs/2020/09/21/clickhouse-and-friends-14-compute-storage/index.html index 516877cc..7196c7b9 100644 --- a/docs/2020/09/21/clickhouse-and-friends-14-compute-storage/index.html +++ b/docs/2020/09/21/clickhouse-and-friends-14-compute-storage/index.html @@ -554,7 +554,7 @@

    5 - + diff --git a/docs/2021/01/26/clickhouse-and-friends-15-groupby/index.html b/docs/2021/01/26/clickhouse-and-friends-15-groupby/index.html index e6a52785..0bb7aed9 100644 --- a/docs/2021/01/26/clickhouse-and-friends-15-groupby/index.html +++ b/docs/2021/01/26/clickhouse-and-friends-15-groupby/index.html @@ -566,7 +566,7 @@

    总结 - + diff --git a/docs/2021/08/19/how-to-choose-open-source-licence/index.html b/docs/2021/08/19/how-to-choose-open-source-licence/index.html index 3efb8dd2..5c3b0018 100644 --- a/docs/2021/08/19/how-to-choose-open-source-licence/index.html +++ b/docs/2021/08/19/how-to-choose-open-source-licence/index.html @@ -728,7 +728,7 @@

  • 特性介绍 | MySQL测试框架 MTR 系列教程(四):语法篇
  • 源码分析 | MySQL测试框架 MTR 系列教程(三):源码篇
  • 业内 MySQL 线程池主流方案详解 - MariaDB/Percona/华为/AliSQL/TXSQL/MySQL企业版
  • 特性介绍 | MySQL 测试框架 MTR 系列教程(二):进阶篇 - 内存/线程/代码覆盖率/单元/压力测试
  • 特性介绍 | MySQL 测试框架 MTR 系列教程(一):入门篇
  • 推荐 | 一体化实时 HTAP 数据库 StoneDB,如何替换 MySQL 并实现近百倍性能提升
  • 技术分享 | 如何为你的代码选择一个合适的开源协议?
  • 源码分析 | ClickHouse和他的朋友们(15)Group By 为什么这么快
  • 源码分析 | ClickHouse和他的朋友们(14)存储计算分离方案与实现
  • 源码分析 | ClickHouse和他的朋友们(13)ReplicatedMergeTree表引擎及同步机制
  • 源码分析 | ClickHouse和他的朋友们(12)神奇的物化视图(Materialized View)与原理
  • 源码分析 | ClickHouse和他的朋友们(11)MySQL实时复制之GTID模式
  • 问题定位 | Peronca Xtrabackup 8.0近日踩坑总结 - xtrabackup 2.4和8.0区别
  • 源码分析 | ClickHouse和他的朋友们(10)MergeTree Write-Ahead Log
  • 源码分析 | ClickHouse和他的朋友们(9)MySQL实时复制与实现
  • 源码分析 | ClickHouse和他的朋友们 (8) 纯手工打造的SQL解析器
  • 源码分析 | ClickHouse和他的朋友们(6)MergeTree存储结构
  • 源码分析 | ClickHouse和他的朋友们(5)存储引擎技术进化与MergeTree
  • 源码分析 | ClickHouse和他的朋友们(4)Pipeline处理器和调度器
  • 源码分析 | ClickHouse和他的朋友们(3)MySQL Protocol和Write调用栈
  • 源码分析 | ClickHouse和他的朋友们(2)MySQL Protocol和Read调用栈
  • 源码分析 | ClickHouse和他的朋友们(1)编译、开发、测试
  • 特性介绍 | MySQL select count(*) 、count(1)、count(列) 详解(1):概念及区别
  • 捉虫日记 | MySQL 5.7.20 try_acquire_lock_impl 异常导致mysql crash
  • 特性介绍 | MySQL 自增列详解(1):自增列概念及使用
  • 引擎特性 | MySQL MEMORY(HEAP) 存储引擎导致 Slave 节点有本地事务
  • 特性介绍 | Linux 操作系统启动流程
  • 实用工具 | Linux 定时任务 crontab 命令详解
  • 特性分析 | GreenPlum 的并行查询优化策略详解
  • 问题定位 | PostgreSQL 报错 requested WAL segment has already been removed
  • 源码分析 | 使用 gcov 和 lcov 测试 PostgreSQL 代码覆盖率
  • 源码分析 | PostgreSQL 回归测试详解
  • 最佳实践 | 源码编译安装配置 Postgres-XC 集群并用 pg_basebackup 配置 Datanode 热备
  • 特性分析 | GreenPlum Primary/Mirror 同步机制
  • 最佳实践 | CentOS 和 Ubuntu 下安装配置 GreenPlum 数据库集群 - 源码 & 安装包
  • 实用工具 | PostgreSQL 数据库压力测试工具 pgbench 使用示例
  • 特性分析 | PostgreSQL Primary/Standby 主备流复制机制
  • 应用案例 | PostgreSQL libpq 网络库接口操作数据库示例
  • 特性介绍 | PostgreSQL 的依赖约束详解 - 系统表 pg_depend & pg_constraint
  • 程序人生 | C 语言编译器对内存空间的分配原则
  • 程序人生 | unix 网络编程之 getaddrinfo 函数详解及使用举例
  • 程序人生 | Linux Daemon 程序设计示例
  • 系统运维 | Ubuntu 下安装配置samba 服务的详细过程
  • 程序人生 | 我的《C陷阱与缺陷》读书笔记
  • 程序人生 | C语言字节对齐问题详解 - 对齐/字节序/位序/网络序等(下)
  • 程序人生 | C语言字节对齐问题详解 - 对齐/字节序/位序/网络序等(上)
  • 程序人生 | Makefile 常用模板 - 静态链接库/动态链接库/可执行文件
  • 程序人生 | UNIX环境高级编程技巧之 du 指令实现
  • 程序人生 | UNIX环境高级编程技巧之 df 指令实现
  • 特性介绍 | Linux 内存管理机制解析
  • 程序人生 | UNIX 环境高级编程技巧之 getopt & getopt_long 使用示例
  • + diff --git a/docs/2022/07/06/StoneDB-an-integrated-real-time-HTAP-database/index.html b/docs/2022/07/06/StoneDB-an-integrated-real-time-HTAP-database/index.html index 29a769d2..550567eb 100644 --- a/docs/2022/07/06/StoneDB-an-integrated-real-time-HTAP-database/index.html +++ b/docs/2022/07/06/StoneDB-an-integrated-real-time-HTAP-database/index.html @@ -647,7 +647,7 @@

  • 特性介绍 | MySQL测试框架 MTR 系列教程(四):语法篇
  • 源码分析 | MySQL测试框架 MTR 系列教程(三):源码篇
  • 业内 MySQL 线程池主流方案详解 - MariaDB/Percona/华为/AliSQL/TXSQL/MySQL企业版
  • 特性介绍 | MySQL 测试框架 MTR 系列教程(二):进阶篇 - 内存/线程/代码覆盖率/单元/压力测试
  • 特性介绍 | MySQL 测试框架 MTR 系列教程(一):入门篇
  • 推荐 | 一体化实时 HTAP 数据库 StoneDB,如何替换 MySQL 并实现近百倍性能提升
  • 技术分享 | 如何为你的代码选择一个合适的开源协议?
  • 源码分析 | ClickHouse和他的朋友们(15)Group By 为什么这么快
  • 源码分析 | ClickHouse和他的朋友们(14)存储计算分离方案与实现
  • 源码分析 | ClickHouse和他的朋友们(13)ReplicatedMergeTree表引擎及同步机制
  • 源码分析 | ClickHouse和他的朋友们(12)神奇的物化视图(Materialized View)与原理
  • 源码分析 | ClickHouse和他的朋友们(11)MySQL实时复制之GTID模式
  • 问题定位 | Peronca Xtrabackup 8.0近日踩坑总结 - xtrabackup 2.4和8.0区别
  • 源码分析 | ClickHouse和他的朋友们(10)MergeTree Write-Ahead Log
  • 源码分析 | ClickHouse和他的朋友们(9)MySQL实时复制与实现
  • 源码分析 | ClickHouse和他的朋友们 (8) 纯手工打造的SQL解析器
  • 源码分析 | ClickHouse和他的朋友们(6)MergeTree存储结构
  • 源码分析 | ClickHouse和他的朋友们(5)存储引擎技术进化与MergeTree
  • 源码分析 | ClickHouse和他的朋友们(4)Pipeline处理器和调度器
  • 源码分析 | ClickHouse和他的朋友们(3)MySQL Protocol和Write调用栈
  • 源码分析 | ClickHouse和他的朋友们(2)MySQL Protocol和Read调用栈
  • 源码分析 | ClickHouse和他的朋友们(1)编译、开发、测试
  • 特性介绍 | MySQL select count(*) 、count(1)、count(列) 详解(1):概念及区别
  • 捉虫日记 | MySQL 5.7.20 try_acquire_lock_impl 异常导致mysql crash
  • 特性介绍 | MySQL 自增列详解(1):自增列概念及使用
  • 引擎特性 | MySQL MEMORY(HEAP) 存储引擎导致 Slave 节点有本地事务
  • 特性介绍 | Linux 操作系统启动流程
  • 实用工具 | Linux 定时任务 crontab 命令详解
  • 特性分析 | GreenPlum 的并行查询优化策略详解
  • 问题定位 | PostgreSQL 报错 requested WAL segment has already been removed
  • 源码分析 | 使用 gcov 和 lcov 测试 PostgreSQL 代码覆盖率
  • 源码分析 | PostgreSQL 回归测试详解
  • 最佳实践 | 源码编译安装配置 Postgres-XC 集群并用 pg_basebackup 配置 Datanode 热备
  • 特性分析 | GreenPlum Primary/Mirror 同步机制
  • 最佳实践 | CentOS 和 Ubuntu 下安装配置 GreenPlum 数据库集群 - 源码 & 安装包
  • 实用工具 | PostgreSQL 数据库压力测试工具 pgbench 使用示例
  • 特性分析 | PostgreSQL Primary/Standby 主备流复制机制
  • 应用案例 | PostgreSQL libpq 网络库接口操作数据库示例
  • 特性介绍 | PostgreSQL 的依赖约束详解 - 系统表 pg_depend & pg_constraint
  • 程序人生 | C 语言编译器对内存空间的分配原则
  • 程序人生 | unix 网络编程之 getaddrinfo 函数详解及使用举例
  • 程序人生 | Linux Daemon 程序设计示例
  • 系统运维 | Ubuntu 下安装配置samba 服务的详细过程
  • 程序人生 | 我的《C陷阱与缺陷》读书笔记
  • 程序人生 | C语言字节对齐问题详解 - 对齐/字节序/位序/网络序等(下)
  • 程序人生 | C语言字节对齐问题详解 - 对齐/字节序/位序/网络序等(上)
  • 程序人生 | Makefile 常用模板 - 静态链接库/动态链接库/可执行文件
  • 程序人生 | UNIX环境高级编程技巧之 du 指令实现
  • 程序人生 | UNIX环境高级编程技巧之 df 指令实现
  • 特性介绍 | Linux 内存管理机制解析
  • 程序人生 | UNIX 环境高级编程技巧之 getopt & getopt_long 使用示例
  • + diff --git a/docs/2023/03/18/mysql-mtr-01-introduction/index.html b/docs/2023/03/18/mysql-mtr-01-introduction/index.html index 0069486f..a1cc561d 100644 --- a/docs/2023/03/18/mysql-mtr-01-introduction/index.html +++ b/docs/2023/03/18/mysql-mtr-01-introduction/index.html @@ -831,7 +831,7 @@

    - + diff --git a/docs/2023/05/01/mysql-mtr-02-advanced/index.html b/docs/2023/05/01/mysql-mtr-02-advanced/index.html index 0b53caa7..cc48a4af 100644 --- a/docs/2023/05/01/mysql-mtr-02-advanced/index.html +++ b/docs/2023/05/01/mysql-mtr-02-advanced/index.html @@ -1031,7 +1031,7 @@

    - 业内 MySQL 线程池主流方案详解 - MariaDB/Percona/华为/AliSQL/TXSQL/MySQL企业版 + 业内 MySQL 线程池主流方案详解 - MariaDB/Percona/AliSQL/TXSQL/MySQL企业版 @@ -1106,7 +1106,7 @@

    - + @@ -1120,7 +1120,7 @@

  • 特性介绍 | MySQL测试框架 MTR 系列教程(四):语法篇
  • 源码分析 | MySQL测试框架 MTR 系列教程(三):源码篇
  • 业内 MySQL 线程池主流方案详解 - MariaDB/Percona/华为/AliSQL/TXSQL/MySQL企业版
  • 特性介绍 | MySQL 测试框架 MTR 系列教程(二):进阶篇 - 内存/线程/代码覆盖率/单元/压力测试
  • 特性介绍 | MySQL 测试框架 MTR 系列教程(一):入门篇
  • 推荐 | 一体化实时 HTAP 数据库 StoneDB,如何替换 MySQL 并实现近百倍性能提升
  • 技术分享 | 如何为你的代码选择一个合适的开源协议?
  • 源码分析 | ClickHouse和他的朋友们(15)Group By 为什么这么快
  • 源码分析 | ClickHouse和他的朋友们(14)存储计算分离方案与实现
  • 源码分析 | ClickHouse和他的朋友们(13)ReplicatedMergeTree表引擎及同步机制
  • 源码分析 | ClickHouse和他的朋友们(12)神奇的物化视图(Materialized View)与原理
  • 源码分析 | ClickHouse和他的朋友们(11)MySQL实时复制之GTID模式
  • 问题定位 | Peronca Xtrabackup 8.0近日踩坑总结 - xtrabackup 2.4和8.0区别
  • 源码分析 | ClickHouse和他的朋友们(10)MergeTree Write-Ahead Log
  • 源码分析 | ClickHouse和他的朋友们(9)MySQL实时复制与实现
  • 源码分析 | ClickHouse和他的朋友们 (8) 纯手工打造的SQL解析器
  • 源码分析 | ClickHouse和他的朋友们(6)MergeTree存储结构
  • 源码分析 | ClickHouse和他的朋友们(5)存储引擎技术进化与MergeTree
  • 源码分析 | ClickHouse和他的朋友们(4)Pipeline处理器和调度器
  • 源码分析 | ClickHouse和他的朋友们(3)MySQL Protocol和Write调用栈
  • 源码分析 | ClickHouse和他的朋友们(2)MySQL Protocol和Read调用栈
  • 源码分析 | ClickHouse和他的朋友们(1)编译、开发、测试
  • 特性介绍 | MySQL select count(*) 、count(1)、count(列) 详解(1):概念及区别
  • 捉虫日记 | MySQL 5.7.20 try_acquire_lock_impl 异常导致mysql crash
  • 特性介绍 | MySQL 自增列详解(1):自增列概念及使用
  • 引擎特性 | MySQL MEMORY(HEAP) 存储引擎导致 Slave 节点有本地事务
  • 特性介绍 | Linux 操作系统启动流程
  • 实用工具 | Linux 定时任务 crontab 命令详解
  • 特性分析 | GreenPlum 的并行查询优化策略详解
  • 问题定位 | PostgreSQL 报错 requested WAL segment has already been removed
  • 源码分析 | 使用 gcov 和 lcov 测试 PostgreSQL 代码覆盖率
  • 源码分析 | PostgreSQL 回归测试详解
  • 最佳实践 | 源码编译安装配置 Postgres-XC 集群并用 pg_basebackup 配置 Datanode 热备
  • 特性分析 | GreenPlum Primary/Mirror 同步机制
  • 最佳实践 | CentOS 和 Ubuntu 下安装配置 GreenPlum 数据库集群 - 源码 & 安装包
  • 实用工具 | PostgreSQL 数据库压力测试工具 pgbench 使用示例
  • 特性分析 | PostgreSQL Primary/Standby 主备流复制机制
  • 应用案例 | PostgreSQL libpq 网络库接口操作数据库示例
  • 特性介绍 | PostgreSQL 的依赖约束详解 - 系统表 pg_depend & pg_constraint
  • 程序人生 | C 语言编译器对内存空间的分配原则
  • 程序人生 | unix 网络编程之 getaddrinfo 函数详解及使用举例
  • 程序人生 | Linux Daemon 程序设计示例
  • 系统运维 | Ubuntu 下安装配置samba 服务的详细过程
  • 程序人生 | 我的《C陷阱与缺陷》读书笔记
  • 程序人生 | C语言字节对齐问题详解 - 对齐/字节序/位序/网络序等(下)
  • 程序人生 | C语言字节对齐问题详解 - 对齐/字节序/位序/网络序等(上)
  • 程序人生 | Makefile 常用模板 - 静态链接库/动态链接库/可执行文件
  • 程序人生 | UNIX环境高级编程技巧之 du 指令实现
  • 程序人生 | UNIX环境高级编程技巧之 df 指令实现
  • 特性介绍 | Linux 内存管理机制解析
  • 程序人生 | UNIX 环境高级编程技巧之 getopt & getopt_long 使用示例
  • + diff --git a/docs/2023/05/04/mysql-threadpool-main-solutions-details/alisql-sysbench-point-select.png b/docs/2023/05/04/mysql-threadpool-main-solutions-details/alisql-threadpool-point-select.png similarity index 100% rename from docs/2023/05/04/mysql-threadpool-main-solutions-details/alisql-sysbench-point-select.png rename to docs/2023/05/04/mysql-threadpool-main-solutions-details/alisql-threadpool-point-select.png diff --git a/docs/2023/05/04/mysql-threadpool-main-solutions-details/alisql-sysbench-read-write.png b/docs/2023/05/04/mysql-threadpool-main-solutions-details/alisql-threadpool-read-write.png similarity index 100% rename from docs/2023/05/04/mysql-threadpool-main-solutions-details/alisql-sysbench-read-write.png rename to docs/2023/05/04/mysql-threadpool-main-solutions-details/alisql-threadpool-read-write.png diff --git a/docs/2023/05/04/mysql-threadpool-main-solutions-details/alisql-sysbench-update-non-index.png b/docs/2023/05/04/mysql-threadpool-main-solutions-details/alisql-threadpool-update-non-index.png similarity index 100% rename from docs/2023/05/04/mysql-threadpool-main-solutions-details/alisql-sysbench-update-non-index.png rename to docs/2023/05/04/mysql-threadpool-main-solutions-details/alisql-threadpool-update-non-index.png diff --git a/docs/2023/05/04/mysql-threadpool-main-solutions-details/alisql-sysbench-write-only.png b/docs/2023/05/04/mysql-threadpool-main-solutions-details/alisql-threadpool-write-only.png similarity index 100% rename from docs/2023/05/04/mysql-threadpool-main-solutions-details/alisql-sysbench-write-only.png rename to docs/2023/05/04/mysql-threadpool-main-solutions-details/alisql-threadpool-write-only.png diff --git a/docs/2023/05/04/mysql-threadpool-main-solutions-details/huawei-kenpeng-worker-flow-chart.png b/docs/2023/05/04/mysql-threadpool-main-solutions-details/huawei-kenpeng-worker-flow-chart.png deleted file mode 100644 index cb926788..00000000 Binary files a/docs/2023/05/04/mysql-threadpool-main-solutions-details/huawei-kenpeng-worker-flow-chart.png and /dev/null differ diff --git a/docs/2023/05/04/mysql-threadpool-main-solutions-details/huawei-kunpeng-threadpool-benchmark.png b/docs/2023/05/04/mysql-threadpool-main-solutions-details/huawei-kunpeng-threadpool-benchmark.png deleted file mode 100644 index a43f500e..00000000 Binary files a/docs/2023/05/04/mysql-threadpool-main-solutions-details/huawei-kunpeng-threadpool-benchmark.png and /dev/null differ diff --git a/docs/2023/05/04/mysql-threadpool-main-solutions-details/index.html b/docs/2023/05/04/mysql-threadpool-main-solutions-details/index.html index c7989b27..5eb8b54c 100644 --- a/docs/2023/05/04/mysql-threadpool-main-solutions-details/index.html +++ b/docs/2023/05/04/mysql-threadpool-main-solutions-details/index.html @@ -15,35 +15,31 @@ - + - + - + - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + - + @@ -83,7 +79,7 @@ -业内 MySQL 线程池主流方案详解 - MariaDB/Percona/华为/AliSQL/TXSQL/MySQL企业版 | DBKernel +业内 MySQL 线程池主流方案详解 - MariaDB/Percona/AliSQL/TXSQL/MySQL企业版 | DBKernel @@ -339,7 +335,7 @@

    DBKernel

    - 业内 MySQL 线程池主流方案详解 - MariaDB/Percona/华为/AliSQL/TXSQL/MySQL企业版 + 业内 MySQL 线程池主流方案详解 - MariaDB/Percona/AliSQL/TXSQL/MySQL企业版

    @@ -361,12 +357,12 @@

    - 字数统计: 13.5k(字) + 字数统计: 11.4k(字) - 阅读时长: 48(分) + 阅读时长: 41(分) @@ -381,13 +377,10 @@

    本文首发于 2023-05-04 22:07:40

    -

    本文主要从功能层面对比 percona-server、mariadb、华为鲲鹏 BoostKit 数据库使能套件、阿里云 AliSQL、腾讯 TXSQL、MySQL 企业版线程池方案,都基于 MySQL 8.0。

    -

    至于源码层面,腾讯、阿里云、MySQL 企业版不开源,percona 借鉴了 mariadb 早期版本的实现,而华为鲲鹏同时借鉴了 mariadb 和 percona 的实现,但考虑到线程池代码只有 2000 行左右,相对简单,本文就不做过多阐述了。

    - - -
    +

    本文主要从功能层面对比 percona-server、mariadb、阿里云 AliSQL、腾讯 TXSQL、MySQL 企业版线程池方案,都基于 MySQL 8.0。

    +

    至于源码层面,腾讯、阿里云、MySQL 企业版不开源,percona 借鉴了 mariadb 早期版本的实现,但考虑到线程池代码只有 2000 行左右,相对简单,本文就不做深入阐述。

    -

    版本:
    MariaDB 10.9,
    Percona-Server-8.0.32-24,
    华为鲲鹏 8.0.25

    +

    版本:
    MariaDB 10.9,
    Percona-Server-8.0.32-24

    背景

    社区版的 MySQL 的连接处理方法默认是为每个连接创建一个工作线程的one-thread-per-connectionPer_thread)模式。这种模式存在如下弊端:

      @@ -408,7 +401,7 @@

      背景当连接多、并发低时,通过连接复用,避免创建大量空闲线程,减少系统资源开销。
    • 当连接多、并发高时,通过限制同时运行的线程数,将其控制在合理的范围内,可避免线程调度工作过多和大量缓存失效,减少线程池间上下文切换和热锁争用,从而对 OLTP 场景产生积极影响。
    -

    当连接数上升时,在线程池的帮助下数据库整体吞吐维持在一个较高水准,如图所示。

    +

    当连接数上升时,在线程池的帮助下,将数据库整体吞吐维持在一个较高水准,如图所示。

    线程池模式下数据库整体吞吐

    适用场景

    线程池采用一定数量的工作线程来处理连接请求,线程池在查询相对较短且工作负载受 CPU 限制的情况下效率最高,通常比较适应于 OLTP 工作负载的场景。如果工作负载不受 CPU 限制,那么您仍然可以通过限制线程数量来为数据库内存缓冲区节省内存。

    线程池的不足在于当请求偏向于慢查询时,工作线程阻塞在高时延操作上,难以快速响应新的请求,导致系统吞吐量反而相较于传统 one-thread-per-connection 模式更低。

    @@ -422,10 +415,13 @@

    行业方案:Percona 线程池实现

    由于市面上的线程池方案大多都借鉴了 percona、mariadb 的方案,因此,首先介绍下 percona 线程池的工作机制,再说明其他方案相较于 percona 做了什么改进。

    0. 基本原理

    线程池的基本原理为:预先创建一定数量的工作线程(worker 线程)。在线程池监听线程(listener 线程)从现有连接中监听到新请求时,从工作线程中分配一个线程来提供服务。工作线程在服务结束之后不销毁线程(处于 idle 状态一段时间后会退出),而是保留在线程池中继续等待下一个请求来临。

    下面我们将从线程池架构、新连接的创建与分配、listener 线程、worker 线程、timer 线程等几个方面来介绍 percona 线程池的实现。

    @@ -433,9 +429,9 @@

    线程组的数量是线程池并发的上限,通常而言线程组的数量需要配置成数据库实例的 CPU 核心数量(可通过参数thread_pool_size设置),从而充分利用 CPU。线程组之间通过线程ID % 线程组数的方式分配连接,线程组内通过竞争方式处理连接。

    线程池中还有一个服务于所有线程组的timer 线程,负责周期性(检查时间间隔为threadpool_stall_limit毫秒)检查线程组是否处于阻塞状态。当检测到阻塞的线程组时,timer 线程会通过唤醒或创建新的工作线程(wake_or_create_thread 函数)来让线程组恢复工作。

    创建新的工作线程不是每次都能创建成功,要根据当前的线程组中的线程数是否大于线程组中的连接数,活跃线程数是否为 0,以及上一次创建线程的时间间隔是否超过阈值(这个阈值与线程组中的线程数有关,线程组中的线程数越多,时间间隔越大)。

    -

    Percona 线程池架构图

    +

    Percona线程池组成部分

    线程组内部由多个 worker 线程、0 或 1 个动态 listener 线程、高低优先级事件队列(由网络事件 event 构成)、mutex、epollfd、统计信息等组成。如下图所示:

    -

    Percona 线程组构成

    +

    Percona线程池组架构

    worker 线程:主要作用是从队列中读取并处理事件。

    • 如果该线程所在组中没有 listener 线程,则该 worker 线程将成为 listener 线程,通过 epoll 的方式监听数据,并将监听到的 event 放到线程组中的队列。
    • @@ -445,9 +441,9 @@

      listener 线程:当高低队列为空,listen 线程会自己处理,无论这次获取到多少事务。否则 listen 线程会把请求加入到队列中,如果此时active_thread_count=0,唤醒一个工作线程

      高低优先级队列:为了提高性能,将队列分为优先队列和普通队列。这里采用引入两个新变量thread_pool_high_prio_ticketsthread_pool_high_prio_mode。由它们控制高优先级队列策略。对每个新连接分配可以进入高优先级队列的 ticket。

      2. 新连接的创建与分配

      新连接接入时,线程池按照新连接的线程 id 取模线程组个数来确定新连接归属的线程组(thd->thread_id() % group_count)。这样的分配逻辑非常简洁,但由于没有充分考虑连接的负载情况,繁忙的连接可能会恰巧被分配到相同的线程组,从而导致负载不均衡的现象,这是 percona 线程池值得被优化的点

      -

      线程池新连接的创建与分配

      +

      Percona线程池整体架构图

      选定新连接归属的线程组后,新连接申请被作为事件放入低优先级队列中,等待线程组中 worker 线程将高优先级事件队列处理完后,就会处理低优先级队列中的请求。

      -

      3. listener 线程 【====要不要重新画图或添加 percona 源码笔记图】

      listener 线程是负责监听连接请求的线程,每个线程组都有一个listener 线程

      +

      3. listener 线程

      listener 线程是负责监听连接请求的线程,每个线程组都有一个listener 线程

      percona 线程池的 listener 采用epoll实现。当 epoll 监听到请求事件时,listener 会根据请求事件的类型来决定将其放入哪个优先级事件队列。将事件放入高优先级队列的条件如下(见函数connection_is_high_prio),只需要满足其一即可

      • 当前线程池的工作模式为高优先级模式,在此模式下只启用高优先级队列。(mode == TP_HIGH_PRIO_MODE_STATEMENTS
      • @@ -468,11 +464,11 @@

        +

        Percona listener 线程流程图

        上图来源于腾讯数据库技术公众号

        -

        4. worker 线程 【====要不要重新画图或添加 percona 源码笔记图】

        worker 线程是线程池中真正干活的线程,正常情况下,每个线程组都会有一个活跃的 worker 线程。

        +

        4. worker 线程

        worker 线程是线程池中真正干活的线程,正常情况下,每个线程组都会有一个活跃的 worker 线程。

        worker 在理想状态下,可以高效运转并且快速处理完高低优先级队列中的事件。但是在实际场景中,worker 经常会遭遇 IO、锁等等待情况而难以高效完成任务,此时任凭 worker 线程等待将使得在队列中的事件迟迟得不到处理,甚至可能出现长时间没有 listener 线程监听新请求的情况。为此,每当 worker 遭遇 IO、锁等等待情况,如果此时线程组中没有 listener 线程或者高低优先级事件队列非空,并且没有过多活跃 worker,则会尝试唤醒或者创建一个 worker。

        为了避免短时间内创建大量 worker,带来系统吞吐波动,线程池创建 worker 线程时有一个控制单位时间创建 worker 线程上限的逻辑,线程组内连接数越多则创建下一个线程需要等待的时间越长。

        线程组活跃 worker 线程数量大于等于too_many_active_threads+1时,认为线程组的活跃 worker 数量过多。此时需要对 worker 数量进行适当收敛,首先判断当前线程组是否有 listener 线程:

        @@ -481,19 +477,18 @@

        -

        【尝试获取一个未进入队列的事件】描述错误,此处需要改为【尝试从队列获取事件】。

        +

        Percona worker线程与listener线程的切换

        上图来自于腾讯数据库技术公众号

        -

        5. timer 线程 【====要不要重新画图或添加 percona 源码笔记图】

        timer 线程每隔threadpool_stall_limit时间进行一次所有线程组的扫描(check_stall)。

        +

        5. timer 线程

        timer 线程每隔threadpool_stall_limit时间进行一次所有线程组的扫描(check_stall)。

        当线程组高低优先级队列中存在事件,并且自上次检查至今没有新的事件被 worker 消费,则认为线程组处于停滞状态。

        • 停滞的主要原因可能是长时间执行的非阻塞请求, 也可能发生于线程正在等待但 wait_begin/wait_end (尝试唤醒或创建新的 worker 线程)被上层函数忘记调用的场景。
        • timer 线程会通过唤醒或创建新的 worker 线程来让停滞的线程组恢复工作。

        timer 线程为了尽量减少对正常工作的线程组的影响,在check_stall时采用的是try_lock的方式,如果加不上锁则认为线程组运转良好,不再去打扰。

        -

        timer 线程除上述工作外,还负责终止空闲时间超过wait_timeout秒的客户端

        +

        timer 线程除上述工作外,还负责终止空闲时间超过wait_timeout秒的客户端。

        下面是 Percona 的实现:

        check_stall 函数:

        1
        2
        3
        4
        5
        6
        7
        8
        9
        10
        11
        12
        13
        14
        15
        check_stall
        |-- if (!thread_group->listener && !thread_group->io_event_count) {
        |-- wake_or_create_thread(thread_group); // 重点函数
        |-- }
        |-- thread_group->io_event_count = 0; // 表示自上次 check 之后,当前线程组新获取的 event 数
        |-- if (!thread_group->queue_event_count && !queues_are_empty(*thread_group)) { // 重点函数
        |-- thread_group->stalled = true;
        |-- wake_or_create_thread(thread_group); // 重点函数
        |-- }
        |-- thread_group->queue_event_count = 0;

        static bool queues_are_empty(const thread_group_t &tg) noexcept {
        return (tg.high_prio_queue.is_empty() && // 重点函数
        (tg.queue.is_empty() || too_many_busy_threads(tg))); // 重点函数
        }
        @@ -538,91 +533,9 @@

      • MariaDB (比如 10.9 版本)在 information_schema 中新增了四张表(THREAD_POOL_GROUPSTHREAD_POOL_QUEUESTHREAD_POOL_STATSTHREAD_POOL_WAITS),便于监控线程池状态。
      -

      华为鲲鹏 vs Percona

      概述

      核心功能与 percona 线程池方案相同,优先级调度算法 及 避免低优先级队列语句饿死的策略 也相同,但额外做了一些改进:

      -
        -
      • 借鉴了 MariaDB 的实现,添加了参数 thread_pool_dedicated_listener ,即支持固定 listener 功能。
      • -
      • 添加参数 thread_pool_toobusy :表示线程组是否过于忙碌的线程数阈值。当线程组中活跃的工作线程数+锁或 IO 等待中的工作线程数>该阈值加 1 时,认为线程组过于忙碌,不再处理低优先级的任务,等待当前执行的任务和高优先级队列中的任务被处理,直到线程组回到非忙碌的状态。
      • -
      • 借鉴了 MariaDB 的实现,在 information_schema 中新增了四张表(THREAD_POOL_GROUPSTHREAD_POOL_QUEUESTHREAD_POOL_STATSTHREAD_POOL_WAITS),便于监控线程池状态。
      • -
      • 还有一些优化点:
          -
        • 支持 NUMA 亲和:同一线程组的工作线程分配到同一 NUMA Node。
        • -
        • 高优先级 session 独占 worker 线程:在连接数很大,高负载时,对于一些事务取得了锁等资源时,可优先处理(详见下文)。
        • -
        • listener 线程调用 io_poll_wait 监听 event 时,percona 最少获取 1 个 event 就处理,华为鲲鹏改为了最少获取 2 个 event 才处理。
        • -
        • listener 线程调用 io_poll_wait 后,只要线程组不繁忙,则按需批量唤醒或创建一批 worker 线程(根据本次获得的 event 数量、活跃线程数来决定 worker 数量)。
        • -
        -
      • -
      -

      简单来说,华为鲲鹏的线程池方案 = Percona + MariaDB + NUMA 亲和 + 插件化

      -
      -

      详细说明见官方手册(参考链接 [5.a])。

      -
      -

      接下来重点介绍下华为鲲鹏独有的优化(Percona 和 MariaDB 没有实现)。

      -

      NUMA

      依赖:

      -
      1
      2
      3
      4
      # Ubuntu
      sudo apt install libnuma-dev
      # CentOS
      sudo apt install numactl-devel
      - -

      参数说明:thread_pool_sched_affinity

      -

      是否支持命令行:是

      -

      是否支持配置文件:是

      -

      是否支持动态修改:是

      -

      参数范围:Global

      -

      参数类型:Bool

      -

      默认值:OFF

      -

      允许值:OFF、ON

      -

      线程池插件默认关闭线程组与 numa 亲和。

      -

      本配置功能使用的限制条件为 mysqld 进程可使用整机所有 numa,未使用 numactl 等方式限制 mysqld 进程的可使用 cpu 范围。

      -

      本配置功能开启时,thread_pool_size 配置的数量的线程组将与服务器上的 numa 轮询亲和,即例如整机 numa 数为a,numa 编号为0 ~ a-1,则第 n 个线程组将会与第n%a(n 对 a 的余数)个 numa 进行绑定。与 numa 亲和的线程组上创建的线程都会与该 numa 亲和。通过线程与 numa 亲和,使数据与 session 关联性大的类型的业务的跨 numa 内存访问概率降低,从而提升性能

      -

      NUMA 架构图

      -

      优先 session 独占 worker 线程

      在连接数很大,高负载时,对于一些事务取得了锁等资源时,可优先处理

      -

      原先的处理逻辑(percona/mariadb 也是)是此类连接发生可读事件后,会被线程组加到优先队列中,等待空闲 worker 线程优先处理。

      -

      进一步优化逻辑,需要优先处理的 session 不将当前 worker 还给线程池,继续独占当前 worker 线程,类似每线程每连接的模式,独占 worker 线程专用于处理该优先连接之后的所有语句,直到该连接释放了优先资源转为普通连接,例如该连接事务执行结束释放锁资源。

      -

      优先 session 连接的判断逻辑如下图。

      -

      华为鲲鹏线程池 worker 线程流程图

      -

      以下描述序号对应上图的数字标记点。

      -
        -
      1. 新连接建立时,worker 线程处理器登录校验的逻辑,连接生命周期开始。
      2. -
      3. 新连接登录校验完成后进入是否高优先级 session 的判断。
      4. -
      5. 如果是 Admin 端口上的管理连接,则会一直独占 worker 线程,避免进入等待队列得不到 worker 线程的处理。
      6. -
      7. 如果 session 经过判断后为高优先级的 session,将继续占用当前 worker 线程,进入 [6] 等待下一条 SQL 语句并执行。
      8. -
      9. 如果 session 经过判断后为普通 session,则会将当前 session 的连接标识加入到当前线程组的 epoll_wait 中,当前 worker 线程将状态置为空闲并归还本线程组。
      10. -
      11. epoll_wait 中触发网络可读事件(有 SQL 语句到达)或 worker 独占的 session,将在 worker 线程等待 SQL 语句的到达。
      12. -
      13. worker 线程中等待接收 SQL 语句并执行完成后,若执行结果正常且非结束连接,将进入 [3] 进行 session 优先级判断。
      14. -
      15. 登录校验失败,连接生命周期结束。
      16. -
      17. 等待接收 SQL 语句或执行 SQL 语句出现异常,或 session 结束退出时,连接生命周期结束。
      18. -
      -

      小线程组数模式配置

      相对于默认模式的线程池参数配置,使用小线程组数模式的线程池参数配置时,每个线程组上可以创建更多的 active 线程数,使长查询的连接绑定到某个线程组时,该长查询的连接对该线程组的时延影响可以更小或无明显时延差异

      -

      同时使用小线程组数模式时,对于部分场景(例如 OLTP writeonly)在连接数非常大(例如 8192 个连接)时,仍然可以保持 90%左右的曲线峰值。

      -

      小线程组数模式相对于默认模式(使用默认参数),就是参数配置的优化使用,在高并发连接数时,可以更好保持峰值性能的配置模式,相关配置说明如下表:

      - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
      参数名称默认模式配置小线程组数模式
      thread_pool_size默认为 CPU 逻辑核数,或手动配置为 1-3 倍 CPU 逻辑核数配置为 4 倍 NUMA 数(TPCH 场景测试经验值)
      thread_pool_dedicated_listener默认为 OFF,listener 线程可转为 worker 线程配置为 ON,listener 线程只负责网络事件等待,不转为 worker 线程
      thread_pool_oversubscribe默认为 3配置该值=基线版本最优性能时的连接数/thread_pool_size 的配置值
      thread_pool_toobusy默认为 13配置该值=thread_pool_oversubscribe

      AliSQL vs Percona

      AliSQL 线程池也一定程度借鉴了 Percona 的机制,但也有自己的特色:

        -
      • AliSQL 线程池给予管理类的 SQL 语句更高的优先级,保证这些语句优先执行。这样在系统负载很高时,新建连接、管理、监控等操作也能够稳定执行。
      • +
      • AliSQL 线程池给予管理类的 SQL 语句更高的优先级,保证这些语句优先执行。这样在系统负载很高时,新建连接、管理、监控等操作也能够稳定执行
      • AliSQL 线程池给予复杂查询 SQL 语句相对较低的优先级,并且有最大并发数的限制。这样可以避免过多的复杂 SQL 语句将系统资源耗尽,导致整个数据库服务不可用
      • AliSQL 支持动态开关线程池
      • 从官网手册及内核月报公开资料,无法获知 AliSQL 是否支持线程组专职 listener 。
      • @@ -689,9 +602,12 @@

        在支持thread_handlingPer_thread 和 Thread_pool 模式中来回切换后,我们需要考虑的问题主要有以下几个:

        1.1. 活跃用户连接的 thread_handling 切换

        Per_thread 模式下,每个用户连接对应一个handle_connection线程,handle_connection线程既负责用户网络请求的监听,又负责请求的处理。

        Thread_pool 模式下,每个 thread_group 都用epoll来管理其中所有用户连接的网络事件,监听到的事件放入事件队列中,交予 worker 处理。

        -

        不论是哪种模式,在处理请求的过程中(do_command)切换都不是一个好选择,而在完成一次 command 之后,尚未接到下一次请求之前是一个较合适的切换点。

        +

        不论是哪种模式,在处理请求的过程中(do_command)切换都不是一个好选择,而在完成一次 command 之后,尚未接到下一次请求之前是一个较合适的切换点。

          -
        • 为实现用户连接从 Per_thread 到 Thread_pool 的切换,需要在请求处理完(do_command)之后判断thread_handling是否发生了变化。
          如需切换则立刻按照 2.2 中介绍的逻辑,通过thread_id % group_size选定目标 thread_group,将当前用户连接迁移至 Thread_pool 的目标 thread_group 中,后续该用户连接的所有网络事件统一交予 thread_group 的 epoll 监听。在完成连接迁移之后,handle_connection 线程即可完成退出或者缓存至下一次 Per_thread 模式处理新连接时复用(此为原生 mysql 支持的逻辑,目的是避免 Per_thread 模式下频繁地创建和销毁 handle_connection 线程)。
        • +
        • 为实现用户连接从 Per_thread 到 Thread_pool 的切换,需要在请求处理完(do_command)之后判断thread_handling是否发生了变化。
          如需切换则立刻按照 2.2 中介绍的逻辑,通过thread_id % group_size选定目标 thread_group,将当前用户连接迁移至 Thread_pool 的目标 thread_group 中,后续该用户连接的所有网络事件统一交予 thread_group 的 epoll 监听。在完成连接迁移之后,handle_connection 线程即可完成退出或者缓存至下一次 Per_thread 模式处理新连接时复用(此为原生 mysql 支持的逻辑,目的是避免 Per_thread 模式下频繁地创建和销毁 handle_connection 线程)。
            +
          • handle_connection 函数被 Per_thread_connection_handler::add_connection 函数调用。
          • +
          +
        • 为实现用户连接从 Thread_pool 到 Per_thread 的切换,需要在请求处理完(threadpool_process_request)后,将用户线程网络句柄重新挂载到 epollstart_io)之前判断 thread_handling 是否发生了变化。如需切换则先将网络句柄从 epoll 中移除以及将连接的信息从对应 thread_group 中清除。由于 Per_thread 模式下每个连接对应一个 handle_connection 线程,还需为当前用户连接创建一个 handle_connection 线程,后续当前用户连接的网络监听和请求处理都交予该 handle_connection 线程处理。

        1.2. 新连接的处理

        由于 thread_handling 可能随时动态变化,为了使得新连接能被新 thread_handling 处理,需要在新连接处理接口Connection_handler_manager::process_new_connection中,读取最新的 thread_handling,利用其相应的连接管理方法添加新连接

        @@ -707,7 +623,7 @@

        group_efficiency表示一定的时间周期内,线程组处理完的 event 总数占(工作队列存量 event 数+新增 event 数)的比例。此信息策略的优势在于能够直观反映出线程组一定时间周期内的工作效率,不足在于对于运转良好的线程组也可能存在误判:当时间周期选择不合适时,运转良好的线程组可能存在时而 group_efficiency 小于 1,时而大于 1 的情况。
        上述三种信息策略只是举例说明,还有更多信息策略可以被采用,就不再一一罗列。

        2 .2. 负载均衡的实现介绍

        在明确了度量线程组负载的方法之后,我们接下来讨论如何均衡负载。我们需要考虑的问题主要如下:

        1) 负载均衡算法的触发条件

        -

        负载均衡操作会将用户连接从一个线程组迁移至另一个线程组,在非必要情况下触发用户连接的迁移反而会导致用户连接的性能抖动。为尽可能避免负载均衡算法错误触发,我们需要为触发负载均衡算法设定一个负载阈值 M,以及负载比例 N。只有线程组的负载阈值大于 M,并且其与参与均衡负载的线程组的负载比例大于 N 时,才需要启动负载均衡算法平衡负载

        +

        负载均衡操作会将用户连接从一个线程组迁移至另一个线程组,在非必要情况下触发用户连接的迁移反而会导致用户连接的性能抖动。为尽可能避免负载均衡算法错误触发,我们需要为触发负载均衡算法设定一个负载阈值 M,以及负载比例 N。只有线程组的负载阈值大于 M,并且其与参与均衡负载的线程组的负载比例大于 N 时,才需要启动负载均衡算法平衡负载

        2) 负载均衡的参数对象

        Q:当线程组触发了负载均衡算法后,该由哪些线程组参与平衡高负载线程组的负载呢?

        很容易想到的一个方案是我们维护全局的线程组负载动态序列,让负载最轻的线程组负责分担负载。但是遗憾的是为了维护全局线程组负载动态序列,线程组每处理完一次任务都可能需要更新自身的状态,并在全局锁的保护下更新其在全局负载序列中的位置,如此一来对性能的影响势必较大,因此全局线程组负载动态序列的方案并不理想

        @@ -731,7 +647,7 @@

        3. 线程池断连优化

        3.1. percona 线程池问题

        如前文所述,线程池采用 epoll 来处理网络事件。当 epoll 监听到网络事件时,listener 会将网络事件放入事件队列或自己处理,此时相应用户连接不会被 epoll 监听。percona 线程池需要等到请求处理结束之后才会使用 epoll 重新监听用户连接的新网络事件。percona 线程池这样的设计通常不会带来问题,因为用户连接在请求未被处理时,也不会有发送新请求的需求。但特殊情况下,如果用户连接在重新被 epoll 监听前自行退出了,此时用户连接发出的断连信号无法被 epoll 捕捉,因此在 mysql 服务器端无法及时退出该用户连接。这样带来的影响主要有两点:

        +

        3. 线程池断连优化

        3.1. percona 线程池问题

        如前文所述,线程池采用 epoll 来处理网络事件。当 epoll 监听到网络事件时,listener 会将网络事件放入事件队列或自己处理,此时相应用户连接不会被 epoll 监听。percona 线程池需要等到请求处理结束之后才会使用 epoll 重新监听用户连接的新网络事件。percona 线程池这样的设计通常不会带来问题,因为用户连接在请求未被处理时,也不会有发送新请求的需求。但特殊情况下,如果用户连接在重新被 epoll 监听前自行退出了,此时用户连接发出的断连信号无法被 epoll 捕捉,因此在 mysql 服务器端无法及时退出该用户连接。这样带来的影响主要有两点:

        1. 用户连接客户端虽已退出,但 mysql 服务器端却仍在运行该连接,继续消耗 CPU、内存资源,甚至可能继续持有锁,只有等到连接超时才能退出;
        2. 由于用户连接在 mysql 服务器端未及时退出,连接数也并未清理,如果用户业务连接数较多,可能导致用户新连接数触达最大连接数上限,用户无法连接数据库,严重影响业务。
        3. @@ -741,8 +657,8 @@

          4. 新增用于监控的状态变量

          • 新增指令 show threadpool status ,可展示 25 个线程池状态变量。
          • @@ -753,12 +669,11 @@

            性能结果

            由于腾讯 TXSQL、Percona 官方手册都没有性能数据,因此仅列出其他几种方案的性能结果。

            -

            华为鲲鹏

            华为鲲鹏线程池性能测试

            MariaDB 5.5 - 无优先级队列

            本小节内容来源于官网手册

            MariaDB 官网是基于 5.5 版本线程池测试的,也就是不支持高低优先级队列的版本。

            -

            采用 Sysbench 0.4,以 pitbull (Linux, 24 cores) 的情况来说明在不同场景下的 QPS 情况。

            +

            采用 Sysbench 0.4,以pitbull (Linux, 24 cores) 的情况来说明在不同场景下的 QPS 情况。

            OLTP_RO

            @@ -799,7 +714,7 @@

            OLTP_

            4456
            -

            MariaDB Sysbench oltp_ro 性能

            +

            MariaDB OLTP_RO

            OLTP_RW

            @@ -840,7 +755,7 @@

            OLTP_

            484
            -

            MariaDB Sysbench oltp_rw 性能

            +

            MariaDB OLTP_RW

            POINT_SELECT

            @@ -881,7 +796,7 @@

            +

            MariaDB POINT_SELECT

            UPDATE_NOKEY

            @@ -922,12 +837,12 @@

            +

            MariaDB UPDATE_NOKEY

            AliSQL

            如下是开启线程池和不开启线程池的性能对比。从测试结果可以看出线程池在高并发的情况下有着明显的性能优势。

            -

            update_non_index

            AliSQL update_non_index 性能

            -

            write_only

            AliSQL write_only 性能

            -

            read_write

            AliSQL read_write 性能

            -

            point_select

            AliSQL point_select 性能

            +

            update_non_index

            AliSQL update_non_index

            +

            write_only

            AliSQL write_only

            +

            read_write

            AliSQL read_write

            +

            point_select

            AliSQL point_select

            总结

            功能区别

            @@ -935,7 +850,6 @@

            总结MySQL 企业版

            - @@ -945,9 +859,8 @@

            总结插件

            - - + @@ -955,7 +868,6 @@

            总结5.5 版本引入,10.2 版本完善

            - @@ -963,7 +875,6 @@

            总结

            - @@ -972,7 +883,6 @@

            总结插件式,不支持

            - @@ -982,7 +892,6 @@

            总结设定高低优先级,且低优先级事件等待一段时间可升为高优先级队列

            - @@ -990,7 +899,6 @@

            总结不支持

            - @@ -999,7 +907,6 @@

            总结-

            - @@ -1008,7 +915,6 @@

            总结-

            - @@ -1017,7 +923,6 @@

            总结-

            - @@ -1026,7 +931,6 @@

            总结Windows/Unix

            - @@ -1035,7 +939,6 @@

            总结

            MySQL 8.0.14 以前的版本使用 extra_port 功能(percona & mariadb),8.0.14 及之后版本官方支持了 admin_port 功能。

            -

            由上表可见,华为鲲鹏社区的线程池方案相对较全,腾讯 TXSQL 的优化点也有较大参考价值

            参数区别

            由于业内线程池方案基本都会参考 MariaDB 或 Percona,因此,以 Percona 和 MariaDB 的参数为准,基于 MySQL 8.0,总结其他方案是否有相同或类似参数。

            注意:MySQL 企业版核心方案与 MariaDB 类似,且关于差异点,官方描述较少,因此,不做对比。

            @@ -1046,126 +949,96 @@

            监控区别

            Percona、MariaDB:

            只有两个状态变量:

            @@ -1182,15 +1054,6 @@

            华为鲲鹏

              -
            • information_schema 中增加四张状态信息表
                -
              • THREAD_POOL_GROUPS查询线程组相关信息。
              • -
              • THREAD_POOL_QUEUES查询线程组队列中连接的信息。
              • -
              • THREAD_POOL_STATS查询线程组状态信息的统计值,比如线程组由于 check_stall 创建的线程数、由 listener 线程 poll 到的任务数等。
              • -
              • THREAD_POOL_WAITS提供线程组的 worker 线程在执行 SQL 语句时,各类等待原因的统计数据。 等待原因有:UNKNOWN、SLEEP、DISKIO、ROW_LOCK、GLOBAL_LOCK、META_DATA_LOCK、TABLE_LOCK、USER_LOCK、BINLOG、GROUP_COMMIT、SYNC、NET。
              • -
              -
            • -

            阿里云 AliSQL

            新增了一些状态变量:

            MariaDB Percona华为鲲鹏 腾讯 TXSQL 阿里云 AliSQL
            非插件 非插件插件 非插件-据传是插件方式
            版本5.5-5.7/8.0 5.7/8.05.7/8.0 5.6/5.7/8.0
            不支持 不支持插件式,不支持 支持 支持
            设定高低优先级,且限制每个连接在高优先级队列中的票数 设定高低优先级,且限制每个连接在高优先级队列中的票数设定高低优先级,且限制每个连接在高优先级队列中的票数 控制事务、非事务语句的比例
            不支持 不支持不支持 支持 -
            不支持 不支持不支持 支持 -
            2 个状态变量 2 个状态变量4 张状态信息表 27 个状态变量 8 个状态变量
            - MariaDBPercona + MariaDB 10.2 及之后版本 Percona MariaDB 5.5
            Windows/Unix/MacOS Windows/UnixUnix - -
            @@ -1367,51 +1230,11 @@

            MySQL · 最佳实践 · MySQL 多队列线程池优化 (taobao.org) -
          • 华为鲲鹏:
              -
            1. MySQL 8.0.25-MySQL 线程池特性-鲲鹏 BoostKit 数据库使能套件-文档首页-鲲鹏社区 (hikunpeng.com)
            2. -
            -
          • MySQL 企业版:
            1. MySQL :: MySQL 8.0 Reference Manual :: 5.6.3 MySQL Enterprise Thread Pool
          • -
            -

            欢迎关注我的微信公众号【数据库内核】:分享主流开源数据库和存储引擎相关技术。

            -欢迎关注公众号数据库内核 - -

            - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
            标题网址
            GitHubhttps://dbkernel.github.io
            知乎https://www.zhihu.com/people/dbkernel/posts
            思否(SegmentFault)https://segmentfault.com/u/dbkernel
            掘金https://juejin.im/user/5e9d3ed251882538083fed1f/posts
            CSDNhttps://blog.csdn.net/dbkernel
            博客园(cnblogs)https://www.cnblogs.com/dbkernel
            @@ -1420,12 +1243,12 @@

            -

            本文标题:业内 MySQL 线程池主流方案详解 - MariaDB/Percona/华为/AliSQL/TXSQL/MySQL企业版

            +

            本文标题:业内 MySQL 线程池主流方案详解 - MariaDB/Percona/AliSQL/TXSQL/MySQL企业版

            文章作者:DBKernel

            发布时间:2023-05-04, 22:07:40

            -

            最后更新:2023-05-08, 16:55:04

            +

            最后更新:2023-10-28, 21:24:26

            - 原始链接:http://dbkernel.github.io/2023/05/04/mysql-threadpool-main-solutions-details/ + 原始链接:http://dbkernel.github.io/2023/05/04/mysql-threadpool-main-solutions-details/

            @@ -1459,7 +1282,7 @@

            文章目录 -
            1. 1. 背景
            2. 2. 适用场景
            3. 3. 行业方案:Percona 线程池实现
              1. 3.1. 0. 基本原理
              2. 3.2. 1. 线程池的架构
              3. 3.3. 2. 新连接的创建与分配
              4. 3.4. 3. listener 线程 【====要不要重新画图或添加 percona 源码笔记图】
              5. 3.5. 4. worker 线程 【====要不要重新画图或添加 percona 源码笔记图】
              6. 3.6. 5. timer 线程 【====要不要重新画图或添加 percona 源码笔记图】
            4. 4. 行业主流方案对比
              1. 4.1. MySQL 企业版 vs MariaDB
              2. 4.2. MariaDB vs Percona
              3. 4.3. 华为鲲鹏 vs Percona
                1. 4.3.1. 概述
                2. 4.3.2. NUMA
                3. 4.3.3. 优先 session 独占 worker 线程
                4. 4.3.4. 小线程组数模式配置
              4. 4.4. AliSQL vs Percona
              5. 4.5. TXSQL vs Percona
                1. 4.5.1. 1. 支持线程池动态切换
                  1. 4.5.1.1. 1.1. 活跃用户连接的 thread_handling 切换
                  2. 4.5.1.2. 1.2. 新连接的处理
                  3. 4.5.1.3. 1.3. thread_handling 切换的快速生效
                2. 4.5.2. 2. 线程池负载均衡优化
                  1. 4.5.2.1. 2.1. 负载的度量
                  2. 4.5.2.2. 2 .2. 负载均衡的实现介绍
                3. 4.5.3. 3. 线程池断连优化
                  1. 4.5.3.1. 3.1. percona 线程池问题
                  2. 4.5.3.2. 3.2. 断连优化的实现介绍
                4. 4.5.4. 4. 新增用于监控的状态变量
            5. 5. 性能结果
              1. 5.1. 华为鲲鹏
              2. 5.2. MariaDB 5.5 - 无优先级队列
                1. 5.2.1. OLTP_RO
                2. 5.2.2. OLTP_RW
                3. 5.2.3. POINT_SELECT
                4. 5.2.4. UPDATE_NOKEY
              3. 5.3. AliSQL
                1. 5.3.1. update_non_index
                2. 5.3.2. write_only
                3. 5.3.3. read_write
                4. 5.3.4. point_select
            6. 6. 总结
              1. 6.1. 功能区别
              2. 6.2. 参数区别
              3. 6.3. 监控区别
                1. 6.3.1. Percona、MariaDB:
                2. 6.3.2. 华为鲲鹏:
                3. 6.3.3. 阿里云 AliSQL:
                4. 6.3.4. 腾讯云 TXSQL:
            7. 7. 参考链接
            +
            1. 1. 背景
            2. 2. 适用场景
            3. 3. 行业方案:Percona 线程池实现
              1. 3.1. 0. 基本原理
              2. 3.2. 1. 线程池的架构
              3. 3.3. 2. 新连接的创建与分配
              4. 3.4. 3. listener 线程
              5. 3.5. 4. worker 线程
              6. 3.6. 5. timer 线程
            4. 4. 行业主流方案对比
              1. 4.1. MySQL 企业版 vs MariaDB
              2. 4.2. MariaDB vs Percona
              3. 4.3. AliSQL vs Percona
              4. 4.4. TXSQL vs Percona
                1. 4.4.1. 1. 支持线程池动态切换
                  1. 4.4.1.1. 1.1. 活跃用户连接的 thread_handling 切换
                  2. 4.4.1.2. 1.2. 新连接的处理
                  3. 4.4.1.3. 1.3. thread_handling 切换的快速生效
                2. 4.4.2. 2. 线程池负载均衡优化
                  1. 4.4.2.1. 2.1. 负载的度量
                  2. 4.4.2.2. 2 .2. 负载均衡的实现介绍
                3. 4.4.3. 3. 线程池断连优化
                  1. 4.4.3.1. 3.1. percona 线程池问题
                  2. 4.4.3.2. 3.2. 断连优化的实现介绍
                4. 4.4.4. 4. 新增用于监控的状态变量
            5. 5. 性能结果
              1. 5.1. MariaDB 5.5 - 无优先级队列
                1. 5.1.1. OLTP_RO
                2. 5.1.2. OLTP_RW
                3. 5.1.3. POINT_SELECT
                4. 5.1.4. UPDATE_NOKEY
              2. 5.2. AliSQL
                1. 5.2.1. update_non_index
                2. 5.2.2. write_only
                3. 5.2.3. read_write
                4. 5.2.4. point_select
            6. 6. 总结
              1. 6.1. 功能区别
              2. 6.2. 参数区别
              3. 6.3. 监控区别
                1. 6.3.1. Percona、MariaDB:
                2. 6.3.2. 阿里云 AliSQL:
                3. 6.3.3. 腾讯云 TXSQL:
            7. 7. 参考链接