Index 建立的時機:先建還是後建?

更新 發佈閱讀 6 分鐘

前陣子在跟同事討論一段 SP(Stored Procedure)的效能問題,話題漸漸轉到了 Table 建立時的設計策略。

同事的想法是這樣的:「建 Table 的時候就把欄位結構跟 Index 都設定好,之後 Insert 資料就一步到位,感覺比較有效率。」

而我的直覺剛好相反:「不對吧,Index 本身會影響 Insert 的速度,應該是先把資料塞完,最後再建 Index?」

兩個人都有點不確定,但認知方向剛好相反,就決定一起查清楚;結果,我的印象是對的,但要加一些但書。

為什麼 Index 會讓 Insert 變慢?

要解釋這件事,得先聊聊資料庫最常用的 Index 結構:B-Tree。

B-Tree 是什麼?

B-Tree 是大多數關聯式資料庫(PostgreSQL、MySQL、SQL Server)預設使用的 Index 結構,它長這樣:

          [50]
/ \
[25] [75]
/ \ / \
[10] [40] [60] [90]

重點有三個:

  • 樹的每一層都保持平衡:葉子節點都在同一深度
  • 資料有排序:從左到右值是遞增的
  • 查詢速度快:找一筆資料需要 O(log n) 次比較

因為 B-Tree 要維持排序與平衡的特性,每次 Insert 一筆資料,都必須同時更新 B-Tree 的結構。

Insert 時到底發生什麼事?

每當你 INSERT 一筆新資料,資料庫不只是把那筆資料寫進去而已,它還要:

  1. 找到這筆資料在 B-Tree 中對應的位置
  2. 把新資料插入正確的節點
  3. 如果節點滿了,觸發「節點分裂(node split)」,重新調整樹的結構
  4. 必要時,更新上層節點的資訊

如果你有 3 個 Index,就得重複這個過程 3 次;資料量越大,這個效能開銷就越明顯。

先 Insert 再建 Index,好在哪裡?

當你先塞完所有資料、再一次建立 Index 時,資料庫可以走「批次建立」的路線:

  • 一次讀完所有資料,做整體排序
  • 從排序後的資料直接建 B-Tree,不需要一邊插入一邊調整平衡
  • 最終結果就是一棵完美平衡的 B-Tree,而且 I/O 操作少非常多

就像整理一本書的目錄,是邊寫邊整理目錄比較快,還是全部寫完最後一次整理比較快?應該是後者會比較快。

業界怎麼說?

這不只是直覺,主流資料庫社群有相關建議:

PostgreSQL

大量 Insert 前,建議先 DROP INDEX,Insert 完成後再重建,原因是大量 Insert 的效能會受到既有 Index 顯著影響。

MySQL

DISABLE KEYS 的優化原理就是先在記憶體中建立 Index tree,最後再一次寫入磁碟,避免大量 disk seek,這比逐筆 Insert 時維護 Index 快非常多。

那……什麼時候應該先建 Index?

這裡有個重要的但書,我的同事不是完全錯的:

情境

建議做法

全新 Table,大量初始資料載入

先 Insert,後建 Index

Table 已有大量舊資料,追加少量

保留 Index 直接 Insert(省掉重建成本)

線上系統持續寫入

Index 必須常駐,無法拿掉

一次插入量不到 Table 的 10~20%

直接 Insert 就好,重建 Index 反而多此一舉

所以「先建 Index 再 Insert」在日常開發的線上系統場景,其實是正常的做法;問題主要出現在大批量資料載入(ETL、資料遷移、初始化)的情境。

操作範例

PostgreSQL

-- 大量載入前,先移除 Index
DROP INDEX idx_user_email;

-- 批次 Insert 資料
INSERT INTO users (id, email, name)
SELECT ...;

-- 資料載入完畢,重建 Index
CREATE INDEX idx_user_email ON users(email);

-- 記得更新統計資訊
ANALYZE users;

MySQL(InnoDB 版)

注意:DISABLE KEYS 只對 MyISAM 有效,InnoDB 請改用下面的方式:

-- 關閉外鍵檢查(如果有的話)
SET FOREIGN_KEY_CHECKS = 0;

-- 批次插入
INSERT INTO orders (...) VALUES (...), (...), ...;

-- 恢復外鍵檢查
SET FOREIGN_KEY_CHECKS = 1;

-- InnoDB 大批量建議搭配使用 LOAD DATA INFILE,比 INSERT 快很多
LOAD DATA INFILE 'file_name' INTO TABLE orders ...;

跟同事的這場小討論,讓我重新整理了一個平常可能不太會注意到的細節。

  • Index 的存在確實會讓 INSERT 變慢,因為每次寫入都要同時維護 B-Tree 結構
  • 大批量資料載入時,先 Insert 再建 Index 更有效率
  • 日常的線上系統,Index 就讓它常駐就好,不需要特別處理

在大多數已上線系統的日常開發場景,先建好 Index 再 Insert 是沒有問題的;不過,如果在做的是 ETL、資料遷移、或是系統初始化,這個細節就得特別注意了。

留言
avatar-img
愷的大冒險 Kai's Adventure
6會員
21內容數
這裡記錄軟體工程相關工具、技能與學習的探索歷程,偶爾分享角落生物的美好日常,希望能透過文字與更多人交流,如果你對這些主題感興趣歡迎留言,讓我們一起碰撞出更多火花!
2026/05/13
80億資料500行的搜尋指令是在工作時遇過得真實場景,這個系列是我在工作實務中歸納出來的學習筆記,起初真的是頭大,找資料找到眼花撩亂,希望可以給需要的人一些頭緒,這系列目前暫定先寫到這裡囉,歡迎大家交流。
2026/05/13
80億資料500行的搜尋指令是在工作時遇過得真實場景,這個系列是我在工作實務中歸納出來的學習筆記,起初真的是頭大,找資料找到眼花撩亂,希望可以給需要的人一些頭緒,這系列目前暫定先寫到這裡囉,歡迎大家交流。
2026/05/11
經過前面四篇文章,能夠知道 Execution Plan 的四大核心:閱讀方向(粗細箭頭)、存取方式(Seek 與 Scan)、關聯策略(三大 Join)以及警告標誌(四大陷阱)。 然而當面對一張包含幾十個、甚至上百個節點的巨大執行計畫時,很容易感到不知所措;這時候需要的是一套系統化的除錯 SOP。
Thumbnail
2026/05/11
經過前面四篇文章,能夠知道 Execution Plan 的四大核心:閱讀方向(粗細箭頭)、存取方式(Seek 與 Scan)、關聯策略(三大 Join)以及警告標誌(四大陷阱)。 然而當面對一張包含幾十個、甚至上百個節點的巨大執行計畫時,很容易感到不知所措;這時候需要的是一套系統化的除錯 SOP。
Thumbnail
2026/05/10
在調校 SQL Server 查詢效能時,有些問題容易被忽略,卻也容易造成嚴重的效能退化:Missing Index、Implicit Conversion、Spill to TempDB、以及 Residual Predicate。整理這四種問題的成因、症狀與修正方式,並說明彼此之間容易混淆的關鍵
Thumbnail
2026/05/10
在調校 SQL Server 查詢效能時,有些問題容易被忽略,卻也容易造成嚴重的效能退化:Missing Index、Implicit Conversion、Spill to TempDB、以及 Residual Predicate。整理這四種問題的成因、症狀與修正方式,並說明彼此之間容易混淆的關鍵
Thumbnail
看更多
你可能也想看
Thumbnail
如果你使用過 Bolt 或是 Lovable 等 AI 寫程式平台,應該會發現它們都內建支援 Supabase 連接。Supabase 為什麼這麼受歡迎?這要從它背後使用的資料庫技術 PostgreSQL 說起。 當你在網路上購物、瀏覽社群媒體、或是查看銀行帳戶餘額時,這些資訊都被存放在「資料庫」
Thumbnail
如果你使用過 Bolt 或是 Lovable 等 AI 寫程式平台,應該會發現它們都內建支援 Supabase 連接。Supabase 為什麼這麼受歡迎?這要從它背後使用的資料庫技術 PostgreSQL 說起。 當你在網路上購物、瀏覽社群媒體、或是查看銀行帳戶餘額時,這些資訊都被存放在「資料庫」
Thumbnail
總是靈感一閃即逝?這篇文章帶你從收集、分類、活用到自動化,打造專屬的寫作資料庫,讓每一個好點子都不再白白流失,轉化成源源不絕的創作能量。適合創作者、部落客、寫手、內容行銷人員必讀的系統化創作指南。
Thumbnail
總是靈感一閃即逝?這篇文章帶你從收集、分類、活用到自動化,打造專屬的寫作資料庫,讓每一個好點子都不再白白流失,轉化成源源不絕的創作能量。適合創作者、部落客、寫手、內容行銷人員必讀的系統化創作指南。
Thumbnail
這學期開了《資料庫管理》這門課程,在最後一堂課當中,除了講完最後一個章節的內容之外,也花了一些時間談了一些課外的事情。回顧課堂所學,不僅是技術層面的 SQL 語法與資料庫設計,更重要的是理解資料在企業決策中的角色,以及如何將這些知識延伸到職涯規劃。 學期中的時候,也幫忙了系上特殊選才招生的面試,學
Thumbnail
這學期開了《資料庫管理》這門課程,在最後一堂課當中,除了講完最後一個章節的內容之外,也花了一些時間談了一些課外的事情。回顧課堂所學,不僅是技術層面的 SQL 語法與資料庫設計,更重要的是理解資料在企業決策中的角色,以及如何將這些知識延伸到職涯規劃。 學期中的時候,也幫忙了系上特殊選才招生的面試,學
Thumbnail
5 月,方格創作島正式開島。這是一趟 28 天的創作旅程。活動期間,每週都會有新的任務地圖與陪跑計畫,從最簡單的帳號使用、沙龍建立,到帶著你從一句話、一張照片開始,一步一步找到屬於自己的創作節奏。不需要長篇大論,不需要完美的文筆,只需要帶上你今天的日常,就可以出發。征服創作島,抱回靈感與大獎!
Thumbnail
5 月,方格創作島正式開島。這是一趟 28 天的創作旅程。活動期間,每週都會有新的任務地圖與陪跑計畫,從最簡單的帳號使用、沙龍建立,到帶著你從一句話、一張照片開始,一步一步找到屬於自己的創作節奏。不需要長篇大論,不需要完美的文筆,只需要帶上你今天的日常,就可以出發。征服創作島,抱回靈感與大獎!
Thumbnail
這篇文章深入淺出地介紹資料庫、資料庫管理系統、SQL 與資料庫設計等重要概念,並涵蓋關聯式資料庫和非關聯式資料庫的區別、特性和應用情境。
Thumbnail
這篇文章深入淺出地介紹資料庫、資料庫管理系統、SQL 與資料庫設計等重要概念,並涵蓋關聯式資料庫和非關聯式資料庫的區別、特性和應用情境。
Thumbnail
本篇文章是作者自學 SQL 的筆記,詳述資料庫中的四種主要語言類別:DDL、DML、TCL 及 DCL,每類別對應的功能與常見操作一一列舉,並深入探討交易的特性及其 ACID 原則。此外,文章還解釋了資料庫的正規化及反正規化的必要性,對於學習 SQL 的讀者有很大的幫助。
Thumbnail
本篇文章是作者自學 SQL 的筆記,詳述資料庫中的四種主要語言類別:DDL、DML、TCL 及 DCL,每類別對應的功能與常見操作一一列舉,並深入探討交易的特性及其 ACID 原則。此外,文章還解釋了資料庫的正規化及反正規化的必要性,對於學習 SQL 的讀者有很大的幫助。
Thumbnail
當代名導基里爾.賽勒布倫尼科夫身兼電影、劇場與歌劇導演,其作品流動著強烈的反叛與詩意。在俄烏戰爭爆發後,他持續以創作回應專制體制的壓迫。《傳奇:帕拉贊諾夫的十段殘篇》致敬蘇聯電影大師帕拉贊諾夫。本文作者透過媒介本質的分析,解構賽勒布倫尼科夫如何利用影劇雙棲的特質,在荒謬世道中尋找藝術的「生存之道」。
Thumbnail
當代名導基里爾.賽勒布倫尼科夫身兼電影、劇場與歌劇導演,其作品流動著強烈的反叛與詩意。在俄烏戰爭爆發後,他持續以創作回應專制體制的壓迫。《傳奇:帕拉贊諾夫的十段殘篇》致敬蘇聯電影大師帕拉贊諾夫。本文作者透過媒介本質的分析,解構賽勒布倫尼科夫如何利用影劇雙棲的特質,在荒謬世道中尋找藝術的「生存之道」。
Thumbnail
在上一篇Notion實作文章中,我們已經將大部分的功能解釋完了。在這篇文章中,我們將會專注在建立管理讀書進度的資料庫。 我先來說明一下我想要這個資料庫達成的事情: 我可以根據我對知識的掌握程度訂定隔幾天之後要再複習,並利用上次複習時間讓這個資料庫自動計算、過濾出每天我該複習什麼。
Thumbnail
在上一篇Notion實作文章中,我們已經將大部分的功能解釋完了。在這篇文章中,我們將會專注在建立管理讀書進度的資料庫。 我先來說明一下我想要這個資料庫達成的事情: 我可以根據我對知識的掌握程度訂定隔幾天之後要再複習,並利用上次複習時間讓這個資料庫自動計算、過濾出每天我該複習什麼。
Thumbnail
見諸參與鄧伯宸口述,鄧湘庭於〈那個大霧的時代〉記述父親回憶,鄧伯宸因故遭受牽連,而案件核心的三人,在鄧伯宸記憶裡:「成立了成大共產黨,他們製作了五星徽章,印刷共產黨宣言——刻鋼板的——他們收集中共空飄的傳單,以及中國共產黨中央委員會有關文化大革命決議文的英文打字稿,另外還有手槍子彈十發。」
Thumbnail
見諸參與鄧伯宸口述,鄧湘庭於〈那個大霧的時代〉記述父親回憶,鄧伯宸因故遭受牽連,而案件核心的三人,在鄧伯宸記憶裡:「成立了成大共產黨,他們製作了五星徽章,印刷共產黨宣言——刻鋼板的——他們收集中共空飄的傳單,以及中國共產黨中央委員會有關文化大革命決議文的英文打字稿,另外還有手槍子彈十發。」
Thumbnail
當時間變少之後,看戲反而變得更加重要——這是在成為母親之後,我第一次誠實地面對這一件事:我沒有那麼多的晚上,可以任性地留給自己了。看戲不再只是「今天有沒有空」,而是牽動整個週末的結構,誰應該照顧孩子,我該在什麼時間回到家,隔天還有沒有精神帶小孩⋯⋯於是,我不得不學會一件以前並不擅長的事:挑選。
Thumbnail
當時間變少之後,看戲反而變得更加重要——這是在成為母親之後,我第一次誠實地面對這一件事:我沒有那麼多的晚上,可以任性地留給自己了。看戲不再只是「今天有沒有空」,而是牽動整個週末的結構,誰應該照顧孩子,我該在什麼時間回到家,隔天還有沒有精神帶小孩⋯⋯於是,我不得不學會一件以前並不擅長的事:挑選。
Thumbnail
你會用Notion的wiki功能嗎?,其實他是一個可以統一管理所有的控制板頁面和資料庫的超方便功能!有邏輯的建立好資料庫跟控制板的系統架構,不僅省時間還能提高效率。如果你的Notion系統裡面還沒用過wiki功能,快去試試看吧!
Thumbnail
你會用Notion的wiki功能嗎?,其實他是一個可以統一管理所有的控制板頁面和資料庫的超方便功能!有邏輯的建立好資料庫跟控制板的系統架構,不僅省時間還能提高效率。如果你的Notion系統裡面還沒用過wiki功能,快去試試看吧!
Thumbnail
很多人問我,現在 AI 這麼發達,為什麼還要學 SQL(結構化查詢語言)?其實,AI 雖然強大,但它需要「正確的數據結構」才能發揮威力。作為一名學生,我發現學會管理資料庫,不僅是為了應付老師的作業,更是為了在未來掌握「數據變現」的門票。 【重點一:從老師的作業,看見商業邏輯】 在課堂上,我們練習建
Thumbnail
很多人問我,現在 AI 這麼發達,為什麼還要學 SQL(結構化查詢語言)?其實,AI 雖然強大,但它需要「正確的數據結構」才能發揮威力。作為一名學生,我發現學會管理資料庫,不僅是為了應付老師的作業,更是為了在未來掌握「數據變現」的門票。 【重點一:從老師的作業,看見商業邏輯】 在課堂上,我們練習建
追蹤感興趣的內容從 Google News 追蹤更多 vocus 的最新精選內容追蹤 Google News