加上二級索引之後,主鍵查詢的快慢反過來
「MySQL 主鍵查詢比較快」是對的,但那是只用主鍵查的世界。現實的查詢大多是「用名字找人」而不是「用號碼找人」——換成二級索引,贏的人就換邊。
關鍵:兩邊的二級索引存的東西不一樣
| 二級索引的那一列存什麼 | 讀取路徑 | |
|---|---|---|
| PostgreSQL | 欄位值 → CTID(物理位置) | 二級索引 → Heap|2 跳 |
| MySQL (InnoDB) | 欄位值 → 主鍵值(不是位址!) | 二級索引 → 主鍵索引 → 資料|3 跳,這一步叫回表(Double Lookup) |
MySQL 的二級索引不存數據地址,存的是主鍵值——所以拿到結果之後還要再走一次主鍵 B+ Tree 才摸得到資料行。資料量大時這一趟就比 PG 慢。
所以判準是「你的查詢長什麼樣」
| 業務形狀 | 選 |
|---|---|
| 90% 都是用主鍵查(使用者系統、訂單流水) | MySQL — 一趟就到 |
| 查詢條件靈活、充滿複雜組合、吃大量二級索引 | PostgreSQL — 結構上更穩定,優化器的 Bitmap Scan 擅長組合多個索引 |
不要拿「主鍵查詢誰快」去回答「這個系統該選誰」——前者是單點比較,後者要看查詢分布。
代價在另一邊
PG 這個「索引直指位置」的優勢是有條件的:位置一變,所有索引都得改 → PG 的寫入放大來自位置過期,不是欄位變動。所以 PG 的讀取優勢建立在這張表不常 UPDATE 的前提上。