資料庫系列 - 2: 索引

更新於 發佈於 閱讀時間約 4 分鐘

這個小節我們來談一下關於資料庫中的索引吧!

何謂索引 index

基本上,索引是一種 B-tree 的資料結構,主要用於加速資料的查詢以及更新,並大幅減少資料庫的壓力。[註1]

一般來說,資料庫使用者只會直接看到存放資料的資料表,然而實際上在 DB 裡面會存放著這些資料以 index 去建立 B-tree 的結構,有多少個 index 就會建立多少的 B-tree ,而實際在進行 SQL 處理時也是用 B-tree 去處理,並把結果更新在我們一般看到的表以及其他 index 的 B-tree 上。

情境

介紹完了索引後,應該不難發現索引的高效能是建立在損失記憶體的狀況下達成的,因此如果不分你我直接將所有欄位都設定 index 的話,那就失去了當初 index 的意義了,不僅失去了記憶體,在更新的同時也會因為需要更新其他的 B-tree 而損失效能。那麼,通常我們會在什麼情境或條件去設定索引呢?以下三點是我們通常會考量的因素:

  1. 唯一性:要建立索引的欄位內容必須為唯一值、不能重複。
  2. 讀寫次數:如上述所提到,由於每次更動資料都會去改變 B-tree ,因此只有讀的次數大於寫的次數時才會考慮建立索引。
  3. 頻率:在查詢與這張表有關的內容時,通常會用哪些欄位去找資料。

類型

索引的類型可以分為叢集索引( Clustered index )以及非叢集索引( NonClustered index )。最好理解的方式是如參考資料的第一篇文章中所提到,叢集索引就有如一本書的目錄,而非叢集索引則像是一本書的附錄。一本書只會有一個目錄,但可以有零到多個附錄。

最重要的是,資料庫中的資料實際上是用叢集索引的方式去排列的,因此叢集索引基本上等於資料存放位置,而非叢集索引存放的是指標,負責告訴你要查的資料在哪個位置。

索引失效

當我們辛辛苦苦建立完索引後,自然會希望此舉能增加我們查詢的效能,然而在實際應用中,有些 SQL 的情境反而會用不到我們建立好的索引,包含以下這些語句:

  1. 類型轉換:如果要搜尋的欄位類型與查詢時使用的類型不同,會需要做類型轉換去查詢(但是仍會有正確的查詢結果)。
  2. 模糊搜尋:模糊搜尋時會降低索引的效能,尤其模糊的部分在字串前綴時。
  3. 特定函數操作:有些函數會讓索引失效,例如 count、sum等。
  4. 不等於:使用 != 或者 <> 都會變成全表掃描去確認是否不相等。
  5. 聯合索引:在聯合索引的情況下時常會讓索引失效。

B tree 跟 B+ tree 的差別

在不同資料庫中,索引所採用的 B-tree 結構稍有不同,分為 B tree 跟 B+ tree 兩種。大家常用的Mysql 採用 B+ tree ,而 mongoDB 採用 B tree 。

B tree 結構中的每個節點都會儲存所有數據;而 B+ tree 結構只有葉節點儲存所有數據,非葉節點則只儲存 key 。

主鍵、外鍵以及索引

最後來稍微區分一下這三個會讓人稍微混淆的名詞吧。

主鍵:設立目的是保持數據唯一性,以避免在特殊狀況下寫了兩筆完全相同的資料進去。每張表都只有一個主鍵(可設為多欄位),此外通常主鍵也會是索引之一。

外鍵:是為了建立表與表間的連結,透過外鍵可以更容易知道表之間是如何串接的。

索引:主要作用是加速資料的查詢,不論是單獨這張表,還是表與表之間的聯合查詢。


[註1] 在此不詳細解釋 Binary-tree 的相關內容,有興趣者可自行去查找資料。

參考資料:

  1. https://isdaniel.github.io/dbindex-1/
  2. https://medium.com/weis-note/索引是什麼-為什麼加了索引查詢會變快-what-is-indexing-how-the-indexing-makes-select-queries-faster-1310ca328b3c
  3. https://wenwender.wordpress.com/2022/08/26/資料庫的索引index工作原理/
留言
avatar-img
留言分享你的想法!
avatar-img
林柏宇的沙龍
2會員
52內容數
test
林柏宇的沙龍的其他內容
2025/05/04
本文詳細介紹了 RabbitMQ 的基本概念、架構以及其在現代系統中的重要性。RabbitMQ 作為一套開源的訊息佇列服務,旨在有效管理通訊流,增強系統穩定性和擴展性。透過描述佇列、交換器及消費者等核心組件的功能,並探討其在微服務和事件驅動架構中的應用。
Thumbnail
2025/05/04
本文詳細介紹了 RabbitMQ 的基本概念、架構以及其在現代系統中的重要性。RabbitMQ 作為一套開源的訊息佇列服務,旨在有效管理通訊流,增強系統穩定性和擴展性。透過描述佇列、交換器及消費者等核心組件的功能,並探討其在微服務和事件驅動架構中的應用。
Thumbnail
2025/04/27
JWT(JSON Web Token)是基於 JSON 格式的開放標準,主要用於身份驗證與權限確認。本文介紹了JWT的基本結構,並闡述其特點,如降低資料庫壓力、靈活性及無狀態性。JWT 特別適用於分佈式系統。本篇將協助讀者深入理解 JWT 的重要性與實際應用。
Thumbnail
2025/04/27
JWT(JSON Web Token)是基於 JSON 格式的開放標準,主要用於身份驗證與權限確認。本文介紹了JWT的基本結構,並闡述其特點,如降低資料庫壓力、靈活性及無狀態性。JWT 特別適用於分佈式系統。本篇將協助讀者深入理解 JWT 的重要性與實際應用。
Thumbnail
2025/04/20
本文介紹了容器的基本概念、組成部分以及其在應用開發中的重要性,特別是對初階和高階工程師的影響。透過深入探討容器的優點,以及Docker、Kubernetes和ArgoCD等相關技術,幫助讀者理解容器化的應用與管理,進而簡化開發過程並提高效率。適合對容器技術感興趣的開發者從零開始學習與掌握。
Thumbnail
2025/04/20
本文介紹了容器的基本概念、組成部分以及其在應用開發中的重要性,特別是對初階和高階工程師的影響。透過深入探討容器的優點,以及Docker、Kubernetes和ArgoCD等相關技術,幫助讀者理解容器化的應用與管理,進而簡化開發過程並提高效率。適合對容器技術感興趣的開發者從零開始學習與掌握。
Thumbnail
看更多
你可能也想看
Thumbnail
孩子寫功課時瞇眼?小心近視!這款喜光全光譜TIONE⁺光健康智慧檯燈,獲眼科院長推薦,網路好評不斷!全光譜LED、180cm大照明範圍、5段亮度及色溫調整、350度萬向旋轉,讓孩子學習更舒適、保護眼睛!
Thumbnail
孩子寫功課時瞇眼?小心近視!這款喜光全光譜TIONE⁺光健康智慧檯燈,獲眼科院長推薦,網路好評不斷!全光譜LED、180cm大照明範圍、5段亮度及色溫調整、350度萬向旋轉,讓孩子學習更舒適、保護眼睛!
Thumbnail
創作者營運專員/經理(Operations Specialist/Manager)將負責對平台成長及收入至關重要的 Partnership 夥伴創作者開發及營運。你將發揮對知識與內容變現、影響力變現的精準判斷力,找到你心中的潛力新星或有聲量的中大型創作者加入 vocus。
Thumbnail
創作者營運專員/經理(Operations Specialist/Manager)將負責對平台成長及收入至關重要的 Partnership 夥伴創作者開發及營運。你將發揮對知識與內容變現、影響力變現的精準判斷力,找到你心中的潛力新星或有聲量的中大型創作者加入 vocus。
Thumbnail
在資料分析過程中,透過衡量變數之間的線性或非線性關係,能有效探索數據集,篩選出重要特徵,並進行預測建模。本文介紹瞭如何理解數據、使用相關矩陣找出變數關聯性,以及利用互資訊評估變數之間的依賴程度,幫助資料科學家在建模過程中選擇適當的變數,提升模型效果。
Thumbnail
在資料分析過程中,透過衡量變數之間的線性或非線性關係,能有效探索數據集,篩選出重要特徵,並進行預測建模。本文介紹瞭如何理解數據、使用相關矩陣找出變數關聯性,以及利用互資訊評估變數之間的依賴程度,幫助資料科學家在建模過程中選擇適當的變數,提升模型效果。
Thumbnail
※ 關聯式資料庫(RDBMS)是什麼? 關聯式資料庫(RDBMS)是一種傳統的資料庫系統,以結構化查詢語言(SQL)為基礎,將資料儲存於預定義的表格中。這些表格包括行和列,彼此之間存在明確的關聯性。 ※ 關聯式資料庫(RDBMS)有兩個重要元素: 關聯(Relational): 關聯式資料庫
Thumbnail
※ 關聯式資料庫(RDBMS)是什麼? 關聯式資料庫(RDBMS)是一種傳統的資料庫系統,以結構化查詢語言(SQL)為基礎,將資料儲存於預定義的表格中。這些表格包括行和列,彼此之間存在明確的關聯性。 ※ 關聯式資料庫(RDBMS)有兩個重要元素: 關聯(Relational): 關聯式資料庫
Thumbnail
高效生活,幫助你找回更多自己的時間 歡迎來到 AL 的 Googlesheet 學習筆記系列文章。在這個系列中,我們將一步步介紹各種函數,並將它們應用於日常生活中,加速工作、提高效率。 今天要介紹的是使用 Index 、 Counta 函數尋找最後一列的資料!
Thumbnail
高效生活,幫助你找回更多自己的時間 歡迎來到 AL 的 Googlesheet 學習筆記系列文章。在這個系列中,我們將一步步介紹各種函數,並將它們應用於日常生活中,加速工作、提高效率。 今天要介紹的是使用 Index 、 Counta 函數尋找最後一列的資料!
Thumbnail
這邊統整了過往喜特先生發布過的「資料驗證」系列文! 資料驗證是個「驗證資料是否符合某條件的機制」,我們通常會用它來避免別人輸入無效的值,減少錯誤的發生。你可以按照順序慢慢學習,把資料驗證這功能一次搞懂!
Thumbnail
這邊統整了過往喜特先生發布過的「資料驗證」系列文! 資料驗證是個「驗證資料是否符合某條件的機制」,我們通常會用它來避免別人輸入無效的值,減少錯誤的發生。你可以按照順序慢慢學習,把資料驗證這功能一次搞懂!
Thumbnail
本文介紹了如何使用資料樞紐分析的功能來整理所需的資料,並設定圖表的中文字型,最後提供了繪圖的程式碼範例。
Thumbnail
本文介紹了如何使用資料樞紐分析的功能來整理所需的資料,並設定圖表的中文字型,最後提供了繪圖的程式碼範例。
Thumbnail
在用 QUERY 查詢資料時,你曾遇過在 WHERE 寫很多個 OR 的狀況嗎?有個更簡單好用的寫法推薦給你,來瞧瞧!
Thumbnail
在用 QUERY 查詢資料時,你曾遇過在 WHERE 寫很多個 OR 的狀況嗎?有個更簡單好用的寫法推薦給你,來瞧瞧!
Thumbnail
在POWER QUERY從0到1 #9 樞紐資料行的功能是將長資料轉換成寬資料,使數據可以快速分析。 而所謂的取消資料行樞紐,就是把寬資料轉換成長資料的一個過程,也就是資料的正規化。 如下圖所示,左邊的圖為二維結構,屬於寬資料,每列可能包含多筆數據(1.2.3月),右邊的圖屬於長資料,每列都
Thumbnail
在POWER QUERY從0到1 #9 樞紐資料行的功能是將長資料轉換成寬資料,使數據可以快速分析。 而所謂的取消資料行樞紐,就是把寬資料轉換成長資料的一個過程,也就是資料的正規化。 如下圖所示,左邊的圖為二維結構,屬於寬資料,每列可能包含多筆數據(1.2.3月),右邊的圖屬於長資料,每列都
Thumbnail
這邊統整了所有過去發表過關於 QUERY 函式的教學分享,希望可以方便你按照順序閱讀和練習。 QUERY 可以用來查詢、篩選、聚集、排序資料,還可以做張簡易的資料透視表,是我在 Google 試算表上做數據分析、製作報告、製作儀表板時最常用的函式之一,既方便又好用,誠心推薦!
Thumbnail
這邊統整了所有過去發表過關於 QUERY 函式的教學分享,希望可以方便你按照順序閱讀和練習。 QUERY 可以用來查詢、篩選、聚集、排序資料,還可以做張簡易的資料透視表,是我在 Google 試算表上做數據分析、製作報告、製作儀表板時最常用的函式之一,既方便又好用,誠心推薦!
Thumbnail
你是否曾經遇到這樣的情況?手上有一張表格,需要根據某個欄位進行分類,但表格又很繁雜,如果手動一個個查找,就需要花費大量時間才能找到想要的資料,這樣實在是太沒效率又容易眼花。 今天,我就來教你一個FILTER 函數快速分類技巧,讓你輕鬆掌握數據,節省時間。
Thumbnail
你是否曾經遇到這樣的情況?手上有一張表格,需要根據某個欄位進行分類,但表格又很繁雜,如果手動一個個查找,就需要花費大量時間才能找到想要的資料,這樣實在是太沒效率又容易眼花。 今天,我就來教你一個FILTER 函數快速分類技巧,讓你輕鬆掌握數據,節省時間。
追蹤感興趣的內容從 Google News 追蹤更多 vocus 的最新精選內容追蹤 Google News