核心對比
邊插邊建 (Online Insert)
- 每插入一條記錄,維護 B+ 樹平衡、分裂頁、寫入 WAL 日誌。
- 優點:索引實時可用,支持並發查詢。
- 缺點:大量隨機 I/O,頁分裂導致碎片,CPU 開銷大,大批量導入極慢。
批量載入後建索引 (Bulk Load + Build)
- 數據順序寫入堆表/臨時表,最後掃描排序構建 B+ 樹(如 PostgreSQL
CREATE INDEX, MySQL ALTER TABLE ... ADD INDEX, SQL Server BULK INSERT + 重建)。
- 優點:順序 I/O,無頁分裂,可並行排序,速度快數數量級;索引頁填充因子優化,無碎片。
- 缺點:構建期間索引不可用,需鎖表或維護版本。
數據先存放在哪?
插入時數據先寫入堆表或聚簇索引葉子頁(若有主鍵),二級索引條目暫存於插入緩衝區/變更緩衝區或直接寫入二級索引頁。
特例:VoltDB 等內存數據庫
VoltDB 采用無鎖架構,直接在內存中維護 B+ 樹,邊插邊建開銷極低,適合高吞吐 OLTP。
最佳實踐建議
- 大批量導入 (ETL、數據遷移):**禁用索引/外鍵 → 導入數據 → 重建索引**。
- 日常 OLTP 業務:必須邊插邊建,保證查詢實時性。
- 分區表:按分區構建索引,減少鎖表範圍。