前幾天在 Hacker News Daily 看到「Things You Should Know About Databases」這篇文章,裡面講了很多基本的 RDBMS 的概念,另外 Hacker News 上對應的討論在「Things to know about databases (architecturenotes.co)」這邊。
不過這點在維基百科上也蠻清楚的文字說明:
A B+ tree can be viewed as a B-tree in which each node contains only keys (not key–value pairs), and to which an additional level is added at the bottom with linked leaves.
另外裡面的 sorted 的那張圖:
這邊的說明不完全正確,在維基百科上的「Database index」這個條目裡面有提到 Non-clustered、Clustered 與 Cluster 三種架構,這邊圖片所表示的是 Non-clustered。在 InnoDB 裡面 data 是照 primary key 順序存放的 (沒有指定時會有一套邏輯選出哪個欄位當 PK,最後的情況是有 hidden key)。
再來就是提到 isolation,這邊也講的比較淺,只提到 ANSI 標準裡面的 SERIALIZABLE
、REPEATABLE READ
(RR)、READ COMMITTED
(RC) 與 READ UNCOMMITTED
(RU) 四個,但沒提到像是 SNAPSHOT ISOLATION
(SI) 這類的也很常見的標準。
說到 SI,在查 Snapshot isolation 的資料時整理了一下 PostgreSQL 的混亂情況。
在 PostgreSQL 9.0 以及更早前的版本,你指定 SERIALIZABLE
其實只有做到 Snapshot isolation 的等級,到了 9.1+ 後,SERIALIZABLE
才是真正做到 ANSI 定義的強度:
Snapshot isolation is called "serializable" mode in Oracle and PostgreSQL versions prior to 9.1, which may cause confusion with the "real serializability" mode.
另外 ANSI 定義的 isolation level 很難「用」 (但還是值得學起來,算是基本的東西),實際上的使用都是看各家資料庫對 isolation level 的保證程度來設計。