加上二級索引之後,主鍵查詢的快慢反過來

「MySQL 主鍵查詢比較快」是對的,但那是只用主鍵查的世界。現實的查詢大多是「用名字找人」而不是「用號碼找人」——換成二級索引,贏的人就換邊。

關鍵:兩邊的二級索引存的東西不一樣

二級索引的那一列存什麼讀取路徑
PostgreSQL欄位值 → CTID(物理位置)二級索引 → Heap|2 跳
MySQL (InnoDB)欄位值 → 主鍵值(不是位址!)二級索引 → 主鍵索引 → 資料|3 跳,這一步叫回表(Double Lookup)

MySQL 的二級索引不存數據地址,存的是主鍵值——所以拿到結果之後還要再走一次主鍵 B+ Tree 才摸得到資料行。資料量大時這一趟就比 PG 慢。

所以判準是「你的查詢長什麼樣」

業務形狀選
90% 都是用主鍵查(使用者系統、訂單流水)MySQL — 一趟就到
查詢條件靈活、充滿複雜組合、吃大量二級索引PostgreSQL — 結構上更穩定,優化器的 Bitmap Scan 擅長組合多個索引

不要拿「主鍵查詢誰快」去回答「這個系統該選誰」——前者是單點比較,後者要看查詢分布。

代價在另一邊

PG 這個「索引直指位置」的優勢是有條件的:位置一變,所有索引都得改 → PG 的寫入放大來自位置過期,不是欄位變動。所以 PG 的讀取優勢建立在這張表不常 UPDATE 的前提上。

前置:MySQL 把資料放在主鍵索引的葉子,PostgreSQL 放在獨立的 Heap