## 原子操作概述
近年來隨著服務器上CPU核數的不斷增加,無鎖算法(Lock Free)越來越廣泛的被應用于高并發的系統中。PostgreSQL 做為世界上最高級開源數據庫也在9.5時引入了無鎖算法。本文先介紹了無鎖算法和原子操作在PostgreSQL中的具體實現, 再通過一個[Patch](https://git.postgresql.org/gitweb/?p=postgresql.git;a=commit;h=0e141c0fbb211bdd23783afa731e3eef95c9ad7a)來看一下在PostgreSQL中是如何利用它來解決實際的高并發問題的。
無鎖算法是利用CPU的原子操作實現的數據結構和算法來解決原來只能用鎖才能解決的并發控制問題。 眾所周知,在一個并發系統中特別是高并發的場景下,鎖的使用會影響系統性能。 這里的CPU的原子操作是不可中斷的一個或者一系列操作, 也就是不會被線程調度機制打斷的操作, 運行期間不會有任何的上下文切換。
常用的原子操作包括:
* CAS,Compare & Set,或是 Compare & Swap:?看某內存位置的值是不是等于一個值oldval, 如果是就寫入新值newval,返回一個bool值標識是否做了更新
* Fetch-and-add:?把某個內存位置加上一個值
* Test-and-set:?寫值到某個內存位置并傳回其舊值
本文并不打算對這些原子操作概念和原理本身進行展開討論,有興趣的讀者可以參考Wikipedia或其它的網上文章。
## PostgreSQL中原子操作的實現
由于PostgreSQL是一個跨平臺的開源軟件,支持十幾種CPU架構和眾多的操作系統, 而原子操作又與CPU架構和編譯器緊密相關,所以原子操作在PostgreSQL中的實現稍顯復雜。
在PostgreSQL中原子操作的實現涉及到的文件包括(由于PostgreSQL的頭文件都位于源碼的include目錄里, 所以本文后面的說明頭文件路徑時都是只引用到include子目錄這一層):
* include/port/atomics.h
* include/port/atomics目錄里的所有頭文件
* 源文件 src/backend/port/atomics.c
原子操作的所有對外部模塊可用符號都聲明在頭文件port/atomics.h中, 而其他文件都可看作是原子操作模塊的內部實現文件不允許外部模塊直接引用。 也就是說,如果要在PostgreSQL代碼中使用原子操作只需包含port/atomics.h即可。 而port/atomics.h也是原子操作模塊的最主要的源文件,所有其他的源文件都是通過該文件組織起來的。 下面從port/atomics.h源文件開始分析。
port/atomics.h 整個文件分成4個部分。
第1部分和第2部分分別用來包含具體CPU架構相關的頭文件和各種編譯器相關的頭文件。 這些頭文件都在port/atomics目錄下。第1部分所包含的頭文件里一般都是用匯編語言實現的CPU相關的內存屏障[1](http://mysql.taobao.org/monthly/2016/09/09/#fn.1)和原子操作的實現函數, 目前只在X86架構下用GCC編譯的情況下實現了匯編版本原子操作,而其他的CPU架構則采用第2部分里的編譯器實現的通用版本, 一般的編譯器如GCC[2](http://mysql.taobao.org/monthly/2016/09/09/#fn.2)都內置了原子操作的支持。之所以X86版本提供了基于匯編的實現主要是為了更好的性能和支持更老版本的GCC。 第2部分的最后還包含了port/atomics/fallback.h頭文件,該文件聲明了PostgreSQL自己使用自旋鎖或操作系統的信號量模擬實現的原子操作的版本, 具體實現位于src/backend/port/atomics.c中,這在第1部分和第2部分都沒有找到實現的情況下會使用該版本,注意使用該版本性能會比較差。
通常支持一個新的平臺只需要在port/atomics.h的第1部分或第2部分中實現如下函數即可:
* pg_compiler_barrier()
* pg_write_barrier()
* pg_read_barrier()
* pg_atomic_compare_exchange_u32()
* pg_atomic_fetch_add_u32()
* pg_atomic_test_set_flag()
* pg_atomic_init_flag()
* pg_atomic_clear_flag()
前三個函數是實現內存屏障(Memory Barrier)的,剩下的是基本的原子操作函數, port/atomics.h的第3部分包含了頭文件port/atomics/generic.h, 它利用這幾個基本的原子操作實現更多的原子操作函數。
port/atomics.h第4部分是定義本模塊所有的導出函數,通常都是定義一個簡單的inline函數去調用該函數的具體實現(實現函數名一般為xxx_impl)。 下面是第4部分具體定義的原子操作函數:
* 內存屏障相關函數,包括 compiler barrier 和 read/write barrier
* 語義上的布爾值(PG代碼里叫flag,具體實現上可能映射到一個字節,或一個整數)的原子操作,包括:
* pg_atomic_init_flag,初始化一個flag
* pg_atomic_test_set_flag, Test-And-Set,這也是flag的唯一支持的原子 操作函數
* pg_atomic_unlocked_test_flag,檢查flag是否沒有被設置
* pg_atomic_clear_flag,清除已設置的flag
* 32位無符號整數的原子操作,包括:
* pg_atomic_init_u32, pg_atomic_read_u32, pg_atomic_write_u32,初始化、讀、寫操作
* pg_atomic_exchange_u32,給原子變量賦值并返回原值
* pg_atomic_compare_exchange_u32, 32位無符號整數的CAS操作,比較原子變量和另一個變量的值, 如果相等就賦一個新值到原子變量里,返回一個布爾值標識是否進行了賦值操作
* pg_atomic_fetch_add_u32, pg_atomic_fetch_sub_u32, pg_atomic_fetch_and_u32, pg_atomic_fetch_or_u32 對某個原子變量進行加、減、與、或操作,并返回變量改變之前的值
* pg_atomic_add_fetch_u32, pg_atomic_sub_fetch_u32 對某個原子變量進行加、減操作,并返回變量改變之后的值
* 64位無符號整數的原子操作,與32位的實現的操作函數相似,只是實現的是64位版本,這里需要注意的是, 64位版本并不保證所有平臺的都支持,目前在PostgreSQL的源代碼中還沒有被使用。
在port/atomics.h的文件開頭的注釋里,代碼的作者也提到了:除非必要否則盡量不要使用原子操作, 可以使用更上層的數據結構或算法如LWLock,SpinLock或者普通鎖,因為使用原子操作需要更多的技巧, 寫出完全正確的代碼是比較難的。
目前在PostgreSQL的代碼中有3個地方使用了原子操作來提高并發性能,分別是事務提交時的并發處理, LWLock的實現和Buffer的管理,下一節我們將對其中的一個進行分析,其他對原子操作的使用將會在后續的文章中進行分析。
## 使用原子操作減少事務提交時鎖的爭用
在PostgreSQL中每個Session的執行時的一些關鍵的狀態信息都保存在PGPROC這個結構當中, 如當前所執行事務的事務ID(xid),PostgreSQL維護了一個PGPROC的數組叫ProcArray, 由一個叫ProcArrayLock的鎖保護著。ProcArray在PostgreSQL當中屬于核心數據結構, 在事務的開啟和結束,在執行任何查詢時獲取事務快照(Snapshot)[3](http://mysql.taobao.org/monthly/2016/09/09/#fn.3)做可見性判斷時都會獲取ProcArrayLock鎖去訪問ProcArray。 現在在高并發的情況下ProcArrayLock鎖爭用已經非常嚴重了,在PostgreSQL 9.6時提交了一個Patch使用原子操作來減少對該鎖的爭用。
當一個寫事務提交時,進程要修改自己的PGPROC結構來標識自己已經結束了,其中的一個主要動作是重置自己事務ID(xid), 為了簡化我們后面就管這個過程叫重置xid,這時需要以排它的方式獲取ProcArrayLock鎖,以防拿事務Snapshot的進程看到不一致的結果。 當有很多事務提交時,每一個要提交的進程依次喚醒、拿鎖、放鎖,導致該鎖的過度爭用。為了提高效率這個Patch只讓一個進程獲取ProcArrayLock鎖, 由該進程為所有同時提交的其他進程(Patch里叫一個ProcArray組)集中批量修改。
下面來詳細分析一下該Patch的代碼。Patch修改了PGPROC結構和PGPROC數組頭結構PROC_HDR,在PGPROC中加入了3個成員變量:
~~~
/* Support for group XID clearing. */
/* 如果是一個ProcArray組的成員為true */
bool procArrayGroupMember;
/* 指向下一個ProcArray組的成員 */
pg_atomic_uint32 procArrayGroupNext;
/*
* 這是在調用重置xid的函數所需要傳遞的參數
*/
TransactionId procArrayGroupMemberXid;
~~~
在PROC_HDR中加入一個成員變量:
~~~
/* ProcArray組的第一個成員 */
pg_atomic_uint32 procArrayGroupFirst;
~~~
首先在事務提交時嘗試去獲取ProcArrayLock,如果獲取到了就直接調用重置xid函數, 否則調用一個新加的函數ProcArrayGroupClearXid通過使用原子操作進行批量重置xid。
整個Patch主要邏輯都在ProcArrayGroupClearXid函數中,該函數首先將自己加到ProcArray組的頭部:
~~~
while (true)
{
nextidx = pg_atomic_read_u32(&procglobal->procArrayGroupFirst);
pg_atomic_write_u32(&proc->procArrayGroupNext, nextidx);
if (pg_atomic_compare_exchange_u32(&procglobal->procArrayGroupFirst,
&nextidx,
(uint32) proc->pgprocno))
break;
}
~~~
這段代碼通過對位于PROC_HDR結構中的ProcArray組頭部進行CAS原子操作,不斷的嘗試將自己加入到ProcArray組中, 這里是通過存儲其pgprocno(相當于PGPROC數組下標),形成一個用pgprocno串起來的鏈表。 注意在以上3條語句之間隨時有可能由其他進程插進來把它們自己加到ProcArray組中導致CAS操作失敗, 失敗之后程序會進行下一次循環直到成功。 執行完這段代碼變量nexidx存儲的是原ProcArray組的頭部, 代碼通過比較nextidx來判斷是否是ProcArray組的第一個成員即Leader,Leader的nextidx應該是初值INVALID_PGPROCNO, 由Leader負責整個組的重置xid工作,非Leader成員只需等待Leader完成工作后通知自己即可。
ProcArray組的Leader先獲取PROCArray鎖,然后從組頭部拿到第一個元素,并把組頭置成初值INVALID_PGPROCNO, 這時其他進程可以開始一個新的ProcArray組:
~~~
while (true)
{
nextidx = pg_atomic_read_u32(&procglobal->procArrayGroupFirst);
if (pg_atomic_compare_exchange_u32(&procglobal->procArrayGroupFirst,
&nextidx,
INVALID_PGPROCNO))
break;
}
~~~
注意在執行這段代碼過程中,還會不斷有新到組成員加進來,所以使用了while循環。
這個函數的最后就比較簡單了,ProcArray組的Leader循環組列表對每個成員調用重置xid函數, 最后在釋放了ProcArrayLock鎖之后通知每個組成員繼續執行。
通過對以上Patch代碼的分析我們可以看到PG巧妙的利用了原子操作有效的減少了在高并發的條件下在事務提交時對ProcArrayLock鎖的爭用。 但隨著硬件服務器上CPU核數的不斷增加,并發的不斷加大,ProcArrayLock鎖的爭用仍然是一個需要不斷優化的熱點, 其中一個最有希望的解決方案是使用CSN(commit sequence number)替代原來的事務快照(Snapshot)機制來做可見性判斷, 這在PostgreSQL社區里已經有了Patch,我們將在后續文章進行分析。
* * *
[1](http://mysql.taobao.org/monthly/2016/09/09/#fnr.1)?內存屏障是一個和原子操作相關的概念,限于篇幅本文沒有介紹, 有興趣的讀者可參考PostgreSQL源代碼目錄下的src/backend/storage/lmgr/README.barrier,或其他網上資料
[2](http://mysql.taobao.org/monthly/2016/09/09/#fnr.2)?參見?[GCC 6.2.0 原子操作內置函數](https://gcc.gnu.org/onlinedocs/gcc-6.2.0/gcc/_005f_005fatomic-Builtins.html)
[3](http://mysql.taobao.org/monthly/2016/09/09/#fnr.3)?在獲取事務快照(Snapshot)時需要以共享方式獲取ProcArrayLock鎖, 并且循環整個ProcArray數組來拿到當前所有執行事務的列表,持鎖時間會更長,而且獲取事務快照是一個更頻繁的操作, 根據事務隔離級別的不同,執行每個事務可能要進行多次獲取事務快照操作
- 數據庫內核月報目錄
- 數據庫內核月報 - 2016/09
- MySQL · 社區貢獻 · AliSQL那些事兒
- PetaData · 架構體系 · PetaData第二代低成本存儲體系
- MySQL · 社區動態 · MariaDB 10.2 前瞻
- MySQL · 特性分析 · 執行計劃緩存設計與實現
- PgSQL · 最佳實踐 · pg_rman源碼淺析與使用
- MySQL · 捉蟲狀態 · bug分析兩例
- PgSQL · 源碼分析 · PG優化器淺析
- MongoDB · 特性分析· Sharding原理與應用
- PgSQL · 源碼分析 · PG中的無鎖算法和原子操作應用一則
- SQLServer · 最佳實踐 · TEMPDB的設計
- 數據庫內核月報 - 2016/08
- MySQL · 特性分析 ·MySQL 5.7新特性系列四
- PgSQL · PostgreSQL 邏輯流復制技術的秘密
- MySQL · 特性分析 · MyRocks簡介
- GPDB · 特性分析· Greenplum 備份架構
- SQLServer · 最佳實踐 · RDS for SQLServer 2012權限限制提升與改善
- TokuDB · 引擎特性 · REPLACE 語句優化
- MySQL · 專家投稿 · InnoDB物理行中null值的存儲的推斷與驗證
- PgSQL · 實戰經驗 · 旋轉門壓縮算法在PostgreSQL中的實現
- MySQL · 源碼分析 · Query Cache并發處理
- PgSQL · 源碼分析· pg_dump分析
- 數據庫內核月報 - 2016/07
- MySQL · 特性分析 ·MySQL 5.7新特性系列三
- MySQL · 特性分析 · 5.7 代價模型淺析
- PgSQL · 實戰經驗 · 分組TOP性能提升44倍
- MySQL · 源碼分析 · 網絡通信模塊淺析
- MongoDB · 特性分析 · 索引原理
- SQLServer · 特性分析 · XML與JSON應用比較
- MySQL · 最佳實戰 · 審計日志實用案例分析
- MySQL · 性能優化 · 條件下推到物化表
- MySQL · 源碼分析 · Query Cache內部剖析
- MySQL · 捉蟲動態 · 備庫1206錯誤問題說明
- 數據庫內核月報 - 2016/06
- MySQL · 特性分析 · innodb 鎖分裂繼承與遷移
- MySQL · 特性分析 ·MySQL 5.7新特性系列二
- PgSQL · 實戰經驗 · 如何預測Freeze IO風暴
- GPDB · 特性分析· Filespace和Tablespace
- MariaDB · 新特性 · 窗口函數
- MySQL · TokuDB · checkpoint過程
- MySQL · 特性分析 · 內部臨時表
- MySQL · 最佳實踐 · 空間優化
- SQLServer · 最佳實踐 · 數據庫實現大容量插入的幾種方式
- 數據庫內核月報 - 2016/05
- MySQL · 引擎特性 · 基于InnoDB的物理復制實現
- MySQL · 特性分析 · MySQL 5.7新特性系列一
- PostgreSQL · 特性分析 · 邏輯結構和權限體系
- MySQL · 特性分析 · innodb buffer pool相關特性
- PG&GP · 特性分析 · 外部數據導入接口實現分析
- SQLServer · 最佳實踐 · 透明數據加密在SQLServer的應用
- MySQL · TokuDB · 日志子系統和崩潰恢復過程
- MongoDB · 特性分析 · Sharded cluster架構原理
- PostgreSQL · 特性分析 · 統計信息計算方法
- MySQL · 捉蟲動態 · left-join多表導致crash
- 數據庫內核月報 - 2016/04
- MySQL · 參數故事 · innodb_additional_mem_pool_size
- GPDB · 特性分析 · Segment事務一致性與異常處理
- GPDB · 特性分析 · Segment 修復指南
- MySQL · 捉蟲動態 · 并行復制外鍵約束問題二
- PgSQL · 性能優化 · 如何瀟灑的處理每天上百TB的數據增量
- Memcached · 最佳實踐 · 熱點 Key 問題解決方案
- MongoDB · 最佳實踐 · 短連接Auth性能優化
- MySQL · 最佳實踐 · RDS 只讀實例延遲分析
- MySQL · TokuDB · TokuDB索引結構--Fractal Tree
- MySQL · TokuDB · Savepoint漫談
- 數據庫內核月報 - 2016/03
- MySQL · TokuDB · 事務子系統和 MVCC 實現
- MongoDB · 特性分析 · MMAPv1 存儲引擎原理
- PgSQL · 源碼分析 · 優化器邏輯推理
- SQLServer · BUG分析 · Agent 鏈接泄露分析
- Redis · 特性分析 · AOF Rewrite 分析
- MySQL · BUG分析 · Rename table 死鎖分析
- MySQL · 物理備份 · Percona XtraBackup 備份原理
- GPDB · 特性分析· GreenPlum FTS 機制
- MySQL · 答疑解惑 · 備庫Seconds_Behind_Master計算
- MySQL · 答疑解惑 · MySQL 鎖問題最佳實踐
- 數據庫內核月報 - 2016/02
- MySQL · 引擎特性 · InnoDB 文件系統之文件物理結構
- MySQL · 引擎特性 · InnoDB 文件系統之IO系統和內存管理
- MySQL · 特性分析 · InnoDB transaction history
- PgSQL · 會議見聞 · PgConf.Russia 2016 大會總結
- PgSQL · 答疑解惑 · PostgreSQL 9.6 并行查詢實現分析
- MySQL · TokuDB · TokuDB之黑科技工具
- PgSQL · 性能優化 · PostgreSQL TPC-C極限優化玩法
- MariaDB · 版本特性 · MariaDB 的 GTID 介紹
- MySQL · 特性分析 · 線程池
- MySQL · 答疑解惑 · mysqldump tips 兩則
- 數據庫內核月報 - 2016/01
- MySQL · 引擎特性 · InnoDB 事務鎖系統簡介
- GPDB · 特性分析· GreenPlum Primary/Mirror 同步機制
- MySQL · 專家投稿 · MySQL5.7 的 JSON 實現
- MySQL · 特性分析 · 優化器 MRR & BKA
- MySQL · 答疑解惑 · 物理備份死鎖分析
- MySQL · TokuDB · Cachetable 的工作線程和線程池
- MySQL · 特性分析 · drop table的優化
- MySQL · 答疑解惑 · GTID不一致分析
- PgSQL · 特性分析 · Plan Hint
- MariaDB · 社區動態 · MariaDB on Power8 (下)
- 數據庫內核月報 - 2015/12
- MySQL · 引擎特性 · InnoDB 事務子系統介紹
- PgSQL · 特性介紹 · 全文搜索介紹
- MongoDB · 捉蟲動態 · Kill Hang問題排查記錄
- MySQL · 參數優化 ·RDS MySQL參數調優最佳實踐
- PgSQL · 特性分析 · 備庫激活過程分析
- MySQL · TokuDB · 讓Hot Backup更完美
- PgSQL · 答疑解惑 · 表膨脹
- MySQL · 特性分析 · Index Condition Pushdown (ICP)
- MariaDB · 社區動態 · MariaDB on Power8
- MySQL · 特性分析 · 企業版特性一覽
- 數據庫內核月報 - 2015/11
- MySQL · 社區見聞 · OOW 2015 總結 MySQL 篇
- MySQL · 特性分析 · Statement Digest
- PgSQL · 答疑解惑 · PostgreSQL 用戶組權限管理
- MySQL · 特性分析 · MDL 實現分析
- PgSQL · 特性分析 · full page write 機制
- MySQL · 捉蟲動態 · MySQL 外鍵異常分析
- MySQL · 答疑解惑 · MySQL 優化器 range 的代價計算
- MySQL · 捉蟲動態 · ORDER/GROUP BY 導致 mysqld crash
- MySQL · TokuDB · TokuDB 中的行鎖
- MySQL · 捉蟲動態 · order by limit 造成優化器選擇索引錯誤
- 數據庫內核月報 - 2015/10
- MySQL · 引擎特性 · InnoDB 全文索引簡介
- MySQL · 特性分析 · 跟蹤Metadata lock
- MySQL · 答疑解惑 · 索引過濾性太差引起CPU飆高分析
- PgSQL · 特性分析 · PG主備流復制機制
- MySQL · 捉蟲動態 · start slave crash 診斷分析
- MySQL · 捉蟲動態 · 刪除索引導致表無法打開
- PgSQL · 特性分析 · PostgreSQL Aurora方案與DEMO
- TokuDB · 捉蟲動態 · CREATE DATABASE 導致crash問題
- PgSQL · 特性分析 · pg_receivexlog工具解析
- MySQL · 特性分析 · MySQL權限存儲與管理
- 數據庫內核月報 - 2015/09
- MySQL · 引擎特性 · InnoDB Adaptive hash index介紹
- PgSQL · 特性分析 · clog異步提交一致性、原子操作與fsync
- MySQL · 捉蟲動態 · BUG 幾例
- PgSQL · 答疑解惑 · 詭異的函數返回值
- MySQL · 捉蟲動態 · 建表過程中crash造成重建表失敗
- PgSQL · 特性分析 · 談談checkpoint的調度
- MySQL · 特性分析 · 5.6 并行復制恢復實現
- MySQL · 備庫優化 · relay fetch 備庫優化
- MySQL · 特性分析 · 5.6并行復制事件分發機制
- MySQL · TokuDB · 文件目錄談
- 數據庫內核月報 - 2015/08
- MySQL · 社區動態 · InnoDB Page Compression
- PgSQL · 答疑解惑 · RDS中的PostgreSQL備庫延遲原因分析
- MySQL · 社區動態 · MySQL5.6.26 Release Note解讀
- PgSQL · 捉蟲動態 · 執行大SQL語句提示無效的內存申請大小
- MySQL · 社區動態 · MariaDB InnoDB表空間碎片整理
- PgSQL · 答疑解惑 · 歸檔進程cp命令的core文件追查
- MySQL · 答疑解惑 · open file limits
- MySQL · TokuDB · 瘋狂的 filenum++
- MySQL · 功能分析 · 5.6 并行復制實現分析
- MySQL · 功能分析 · MySQL表定義緩存
- 數據庫內核月報 - 2015/07
- MySQL · 引擎特性 · Innodb change buffer介紹
- MySQL · TokuDB · TokuDB Checkpoint機制
- PgSQL · 特性分析 · 時間線解析
- PgSQL · 功能分析 · PostGIS 在 O2O應用中的優勢
- MySQL · 引擎特性 · InnoDB index lock前世今生
- MySQL · 社區動態 · MySQL內存分配支持NUMA
- MySQL · 答疑解惑 · 外鍵刪除bug分析
- MySQL · 引擎特性 · MySQL logical read-ahead
- MySQL · 功能介紹 · binlog拉取速度的控制
- MySQL · 答疑解惑 · 浮點型的顯示問題
- 數據庫內核月報 - 2015/06
- MySQL · 引擎特性 · InnoDB 崩潰恢復過程
- MySQL · 捉蟲動態 · 唯一鍵約束失效
- MySQL · 捉蟲動態 · ALTER IGNORE TABLE導致主備不一致
- MySQL · 答疑解惑 · MySQL Sort 分頁
- MySQL · 答疑解惑 · binlog event 中的 error code
- PgSQL · 功能分析 · Listen/Notify 功能
- MySQL · 捉蟲動態 · 任性的 normal shutdown
- PgSQL · 追根究底 · WAL日志空間的意外增長
- MySQL · 社區動態 · MariaDB Role 體系
- MySQL · TokuDB · TokuDB數據文件大小計算
- 數據庫內核月報 - 2015/05
- MySQL · 引擎特性 · InnoDB redo log漫游
- MySQL · 專家投稿 · MySQL數據庫SYS CPU高的可能性分析
- MySQL · 捉蟲動態 · 5.6 與 5.5 InnoDB 不兼容導致 crash
- MySQL · 答疑解惑 · InnoDB 預讀 VS Oracle 多塊讀
- PgSQL · 社區動態 · 9.5 新功能BRIN索引
- MySQL · 捉蟲動態 · MySQL DDL BUG
- MySQL · 答疑解惑 · set names 都做了什么
- MySQL · 捉蟲動態 · 臨時表操作導致主備不一致
- TokuDB · 引擎特性 · zstd壓縮算法
- MySQL · 答疑解惑 · binlog 位點刷新策略
- 數據庫內核月報 - 2015/04
- MySQL · 引擎特性 · InnoDB undo log 漫游
- TokuDB · 產品新聞 · RDS TokuDB小手冊
- PgSQL · 社區動態 · 說一說PgSQL 9.4.1中的那些安全補丁
- MySQL · 捉蟲動態 · 連接斷開導致XA事務丟失
- MySQL · 捉蟲動態 · GTID下slave_net_timeout值太小問題
- MySQL · 捉蟲動態 · Relay log 中 GTID group 完整性檢測
- MySQL · 答疑釋惑 · UPDATE交換列單表和多表的區別
- MySQL · 捉蟲動態 · 刪被引用索引導致crash
- MySQL · 答疑釋惑 · GTID下auto_position=0時數據不一致
- 數據庫內核月報 - 2015/03
- MySQL · 答疑釋惑· 并發Replace into導致的死鎖分析
- MySQL · 性能優化· 5.7.6 InnoDB page flush 優化
- MySQL · 捉蟲動態· pid file丟失問題分析
- MySQL · 答疑釋惑· using filesort VS using temporary
- MySQL · 優化限制· MySQL index_condition_pushdown
- MySQL · 捉蟲動態·DROP DATABASE外鍵約束的GTID BUG
- MySQL · 答疑釋惑· lower_case_table_names 使用問題
- PgSQL · 特性分析· Logical Decoding探索
- PgSQL · 特性分析· jsonb類型解析
- TokuDB ·引擎機制· TokuDB線程池
- 數據庫內核月報 - 2015/02
- MySQL · 性能優化· InnoDB buffer pool flush策略漫談
- MySQL · 社區動態· 5.6.23 InnoDB相關Bugfix
- PgSQL · 特性分析· Replication Slot
- PgSQL · 特性分析· pg_prewarm
- MySQL · 答疑釋惑· InnoDB丟失自增值
- MySQL · 答疑釋惑· 5.5 和 5.6 時間類型兼容問題
- MySQL · 捉蟲動態· 變量修改導致binlog錯誤
- MariaDB · 特性分析· 表/表空間加密
- MariaDB · 特性分析· Per-query variables
- TokuDB · 特性分析· 日志詳解
- 數據庫內核月報 - 2015/01
- MySQL · 性能優化· Group Commit優化
- MySQL · 新增特性· DDL fast fail
- MySQL · 性能優化· 啟用GTID場景的性能問題及優化
- MySQL · 捉蟲動態· InnoDB自增列重復值問題
- MySQL · 優化改進· 復制性能改進過程
- MySQL · 談古論今· key分區算法演變分析
- MySQL · 捉蟲動態· mysql client crash一例
- MySQL · 捉蟲動態· 設置 gtid_purged 破壞AUTO_POSITION復制協議
- MySQL · 捉蟲動態· replicate filter 和 GTID 一起使用的問題
- TokuDB·特性分析· Optimize Table
- 數據庫內核月報 - 2014/12
- MySQL· 性能優化·5.7 Innodb事務系統
- MySQL· 踩過的坑·5.6 GTID 和存儲引擎那會事
- MySQL· 性能優化·thread pool 原理分析
- MySQL· 性能優化·并行復制外建約束問題
- MySQL· 答疑釋惑·binlog event有序性
- MySQL· 答疑釋惑·server_id為0的Rotate
- MySQL· 性能優化·Bulk Load for CREATE INDEX
- MySQL· 捉蟲動態·Opened tables block read only
- MySQL· 優化改進· GTID啟動優化
- TokuDB· Binary Log Group Commit with TokuDB
- 數據庫內核月報 - 2014/11
- MySQL· 捉蟲動態·OPTIMIZE 不存在的表
- MySQL· 捉蟲動態·SIGHUP 導致 binlog 寫錯
- MySQL· 5.7改進·Recovery改進
- MySQL· 5.7特性·高可用支持
- MySQL· 5.7優化·Metadata Lock子系統的優化
- MySQL· 5.7特性·在線Truncate undo log 表空間
- MySQL· 性能優化·hash_scan 算法的實現解析
- TokuDB· 版本優化· 7.5.0
- TokuDB· 引擎特性· FAST UPDATES
- MariaDB· 性能優化·filesort with small LIMIT optimization
- 數據庫內核月報 - 2014/10
- MySQL· 5.7重構·Optimizer Cost Model
- MySQL· 系統限制·text字段數
- MySQL· 捉蟲動態·binlog重放失敗
- MySQL· 捉蟲動態·從庫OOM
- MySQL· 捉蟲動態·崩潰恢復失敗
- MySQL· 功能改進·InnoDB Warmup特性
- MySQL· 文件結構·告別frm文件
- MariaDB· 新鮮特性·ANALYZE statement 語法
- TokuDB· 主備復制·Read Free Replication
- TokuDB· 引擎特性·壓縮
- 數據庫內核月報 - 2014/09
- MySQL· 捉蟲動態·GTID 和 DELAYED
- MySQL· 限制改進·GTID和升級
- MySQL· 捉蟲動態·GTID 和 binlog_checksum
- MySQL· 引擎差異·create_time in status
- MySQL· 參數故事·thread_concurrency
- MySQL· 捉蟲動態·auto_increment
- MariaDB· 性能優化·Extended Keys
- MariaDB·主備復制·CREATE OR REPLACE
- TokuDB· 參數故事·數據安全和性能
- TokuDB· HA方案·TokuDB熱備
- 數據庫內核月報 - 2014/08
- MySQL· 參數故事·timed_mutexes
- MySQL· 參數故事·innodb_flush_log_at_trx_commit
- MySQL· 捉蟲動態·Count(Distinct) ERROR
- MySQL· 捉蟲動態·mysqldump BUFFER OVERFLOW
- MySQL· 捉蟲動態·long semaphore waits
- MariaDB·分支特性·支持大于16K的InnoDB Page Size
- MariaDB·分支特性·FusionIO特性支持
- TokuDB· 性能優化·Bulk Fetch
- TokuDB· 數據結構·Fractal-Trees與LSM-Trees對比
- TokuDB·社區八卦·TokuDB團隊