[Day9] 讀 RDBMS 課程 2019 - Primary Key
By Triton Ho
At Lesson 2: Page 28 - End
Notes
- Natural Key: Eg. 身份證號碼, Email, 航班日期 + 航班編號
- Surrogate Key: no specific meaning key, Eg. auto increment, UUID
- 一般商業系統(不考慮報表的部份),90%的資料讀取/改動都是基於 PK 的
- 同一時期建立的 Record ,它們相近時間被改動/刪除的可能性比較高
- 所以為了避免發生 Contention ,不應該把同一時期建立的 Record 集中儲存在一起
- 但也不能過份分散 (影響: Cache hit rate)
- Random PK 會引發大量 Random IO => 會,但若是 heap table ,Random IO 只集中在體積很小的 PK index
Nature Key
Pros:
- 不用再額外建立 Secondary index
- Eg. 若以 Email 作登入的系統,即使不用 Email 作為 PK ,還是要為 email 建立 index 吧
- In general, there is enough randomness to avoid contention
Cons:
- Natural Key 有機會失效
- 部份 ORM 對 composite key 的支援不好,開發時很麻煩
Surrogate Key
Pros:
- 系統邏輯被更動, Surrogate key 幾乎都不受影響的
- PK index and FK index have smaller size
Cons:
- Auto increment 本身是一個潛在的 Contention 問題
- 單純地使用 Auto increment 會讓所有的 insert 集中在 B+ tree 的其中一邊
- Insert 可能造成 contention
- Delete 時造成 B+ tree uneven distribution
- UUID 不能保證 100% 的 uniqueness ,只是相撞可能性很很低
Monotonic Increasing PK
- Eg. Auto increment, timestamp
- Problem: 同一時期的 record ,集中在 PK index 的某一邊 => MI PK 會造成 PK index 一邊不停 splitting ,一邊不停的 merging
More to read
- Rodo log
- Undo log
- check point
- background writer: 每隔一段時間,檢查一次 buffer pool ,把 dirty page 寫回 disk
dirty page: buffer pool 中的 page 被改動過,但尚未寫回 disk