資料庫系列 - 2: 索引

更新於 2024/09/29閱讀時間約 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
2會員
23內容數
test
留言0
查看全部
avatar-img
發表第一個留言支持創作者!
林柏宇的沙龍 的其他內容
本文介紹關聯式資料庫與非關聯式資料庫的基本概念,闡述兩者的差異及各自的應用場景。文章進一步分析了 MySQL 的兩種主要儲存引擎:MyISAM與InnoDB,並探討了它們的優缺點及使用情境,幫助讀者瞭解選擇適合的資料庫引擎所需考量的因素。
本文分享了在面試演算法工程師時經常會遇到的問題及解題方法,包括複雜度分析、五大演算法的介紹、排序方法及動態規劃等。希望這些資訊能幫助求職者在面試時有更好的準備、提高自信,並提供參考資料以便深入學習相關內容。
本文介紹正規表達式的基本概念和常用符號,幫助讀者瞭解如何使用正規表達式來有效搜尋資料和程式碼。在數位時代,正規表達式成為了數據處理和程式開發中不可或缺的工具。透過示範和範例,讀者可以快速掌握正規表達式的基本語法,並應用於實際場景。
本文將介紹 RESTful API 的基本概念、特性及其在現代 Web 開發中的重要性。探討 REST 的設計理念,包括無狀態性、資源格式和 API 接口的最佳實踐,幫助工程師瞭解如何進行有效的 API 設計。
這篇文章介紹了git常用的幾個指令,包括分支合併、重製修改、修改紀錄等。另外也提到了一個好用的小工具tig。這些指令的使用方法和技巧都有詳細介紹,可以幫助讀者更好地使用git。
這篇文章介紹了基礎的 Git 指令,對於懂得使用 Git 的開發人員來說,這些指令都是非常重要且實用的。文章詳細說明瞭每個指令的功能以及如何運用,對於想要更加熟悉 Git 指令的開發人員來說,這是一篇非常實用的文章。
本文介紹關聯式資料庫與非關聯式資料庫的基本概念,闡述兩者的差異及各自的應用場景。文章進一步分析了 MySQL 的兩種主要儲存引擎:MyISAM與InnoDB,並探討了它們的優缺點及使用情境,幫助讀者瞭解選擇適合的資料庫引擎所需考量的因素。
本文分享了在面試演算法工程師時經常會遇到的問題及解題方法,包括複雜度分析、五大演算法的介紹、排序方法及動態規劃等。希望這些資訊能幫助求職者在面試時有更好的準備、提高自信,並提供參考資料以便深入學習相關內容。
本文介紹正規表達式的基本概念和常用符號,幫助讀者瞭解如何使用正規表達式來有效搜尋資料和程式碼。在數位時代,正規表達式成為了數據處理和程式開發中不可或缺的工具。透過示範和範例,讀者可以快速掌握正規表達式的基本語法,並應用於實際場景。
本文將介紹 RESTful API 的基本概念、特性及其在現代 Web 開發中的重要性。探討 REST 的設計理念,包括無狀態性、資源格式和 API 接口的最佳實踐,幫助工程師瞭解如何進行有效的 API 設計。
這篇文章介紹了git常用的幾個指令,包括分支合併、重製修改、修改紀錄等。另外也提到了一個好用的小工具tig。這些指令的使用方法和技巧都有詳細介紹,可以幫助讀者更好地使用git。
這篇文章介紹了基礎的 Git 指令,對於懂得使用 Git 的開發人員來說,這些指令都是非常重要且實用的。文章詳細說明瞭每個指令的功能以及如何運用,對於想要更加熟悉 Git 指令的開發人員來說,這是一篇非常實用的文章。
你可能也想看
Google News 追蹤
Thumbnail
*合作聲明與警語: 本文係由國泰世華銀行邀稿。 證券服務係由國泰世華銀行辦理共同行銷證券經紀開戶業務,定期定額(股)服務由國泰綜合證券提供。   剛出社會的時候,很常在各種 Podcast 或 YouTube 甚至是在朋友間聊天,都會聽到各種市場動態、理財話題,像是:聯準會降息或是近期哪些科
Thumbnail
商業簡報不僅僅是呈現數據,更需要深入瞭解數據分析及有效的工具運用。本文探討於Excel中使用不同函數來改善數據處理效率,包括IF、IFS、VLOOKUP、XLOOKUP及INDEX與MATCH的結合,幫助商業人士更好地從數據中提取洞見,助力業務增值,學習優化數據分析過程,讓您的商業簡報更具影響力。
Thumbnail
在資料分析過程中,透過衡量變數之間的線性或非線性關係,能有效探索數據集,篩選出重要特徵,並進行預測建模。本文介紹瞭如何理解數據、使用相關矩陣找出變數關聯性,以及利用互資訊評估變數之間的依賴程度,幫助資料科學家在建模過程中選擇適當的變數,提升模型效果。
Thumbnail
本文介紹了在進行資料分析時,將類別欄位轉換為數值欄位的方法,包括Label Encoding、One-Hot Encoding、Binary Encoding、Target Encoding和Frequency Encoding。每種方法的應用範例、優缺點和適用場景都有詳細說明。
Thumbnail
※ 關聯式資料庫(RDBMS)是什麼? 關聯式資料庫(RDBMS)是一種傳統的資料庫系統,以結構化查詢語言(SQL)為基礎,將資料儲存於預定義的表格中。這些表格包括行和列,彼此之間存在明確的關聯性。 ※ 關聯式資料庫(RDBMS)有兩個重要元素: 關聯(Relational): 關聯式資料庫
Thumbnail
高效生活,幫助你找回更多自己的時間 歡迎來到 AL 的 Googlesheet 學習筆記系列文章。在這個系列中,我們將一步步介紹各種函數,並將它們應用於日常生活中,加速工作、提高效率。 今天要介紹的是使用 Index 、 Counta 函數尋找最後一列的資料!
Thumbnail
在POWER QUERY從0到1 #9 樞紐資料行的功能是將長資料轉換成寬資料,使數據可以快速分析。 而所謂的取消資料行樞紐,就是把寬資料轉換成長資料的一個過程,也就是資料的正規化。 如下圖所示,左邊的圖為二維結構,屬於寬資料,每列可能包含多筆數據(1.2.3月),右邊的圖屬於長資料,每列都
Thumbnail
這邊統整了所有過去發表過關於 QUERY 函式的教學分享,希望可以方便你按照順序閱讀和練習。 QUERY 可以用來查詢、篩選、聚集、排序資料,還可以做張簡易的資料透視表,是我在 Google 試算表上做數據分析、製作報告、製作儀表板時最常用的函式之一,既方便又好用,誠心推薦!
Thumbnail
你是否曾經遇到這樣的情況?手上有一張表格,需要根據某個欄位進行分類,但表格又很繁雜,如果手動一個個查找,就需要花費大量時間才能找到想要的資料,這樣實在是太沒效率又容易眼花。 今天,我就來教你一個FILTER 函數快速分類技巧,讓你輕鬆掌握數據,節省時間。
※什麼是資料 : 說明: 「資料」(information/data) 是網路應用程式的核心。 使用者分享的照片、電商販賣的產品,或是搜索引擎提供的餐廳評價都是資料。 主要特徵: 生活中任何基本的事實 (fact) 或是值 (value) 都可以被稱為資料。例如:你的名字、你的生日。 因
Thumbnail
*合作聲明與警語: 本文係由國泰世華銀行邀稿。 證券服務係由國泰世華銀行辦理共同行銷證券經紀開戶業務,定期定額(股)服務由國泰綜合證券提供。   剛出社會的時候,很常在各種 Podcast 或 YouTube 甚至是在朋友間聊天,都會聽到各種市場動態、理財話題,像是:聯準會降息或是近期哪些科
Thumbnail
商業簡報不僅僅是呈現數據,更需要深入瞭解數據分析及有效的工具運用。本文探討於Excel中使用不同函數來改善數據處理效率,包括IF、IFS、VLOOKUP、XLOOKUP及INDEX與MATCH的結合,幫助商業人士更好地從數據中提取洞見,助力業務增值,學習優化數據分析過程,讓您的商業簡報更具影響力。
Thumbnail
在資料分析過程中,透過衡量變數之間的線性或非線性關係,能有效探索數據集,篩選出重要特徵,並進行預測建模。本文介紹瞭如何理解數據、使用相關矩陣找出變數關聯性,以及利用互資訊評估變數之間的依賴程度,幫助資料科學家在建模過程中選擇適當的變數,提升模型效果。
Thumbnail
本文介紹了在進行資料分析時,將類別欄位轉換為數值欄位的方法,包括Label Encoding、One-Hot Encoding、Binary Encoding、Target Encoding和Frequency Encoding。每種方法的應用範例、優缺點和適用場景都有詳細說明。
Thumbnail
※ 關聯式資料庫(RDBMS)是什麼? 關聯式資料庫(RDBMS)是一種傳統的資料庫系統,以結構化查詢語言(SQL)為基礎,將資料儲存於預定義的表格中。這些表格包括行和列,彼此之間存在明確的關聯性。 ※ 關聯式資料庫(RDBMS)有兩個重要元素: 關聯(Relational): 關聯式資料庫
Thumbnail
高效生活,幫助你找回更多自己的時間 歡迎來到 AL 的 Googlesheet 學習筆記系列文章。在這個系列中,我們將一步步介紹各種函數,並將它們應用於日常生活中,加速工作、提高效率。 今天要介紹的是使用 Index 、 Counta 函數尋找最後一列的資料!
Thumbnail
在POWER QUERY從0到1 #9 樞紐資料行的功能是將長資料轉換成寬資料,使數據可以快速分析。 而所謂的取消資料行樞紐,就是把寬資料轉換成長資料的一個過程,也就是資料的正規化。 如下圖所示,左邊的圖為二維結構,屬於寬資料,每列可能包含多筆數據(1.2.3月),右邊的圖屬於長資料,每列都
Thumbnail
這邊統整了所有過去發表過關於 QUERY 函式的教學分享,希望可以方便你按照順序閱讀和練習。 QUERY 可以用來查詢、篩選、聚集、排序資料,還可以做張簡易的資料透視表,是我在 Google 試算表上做數據分析、製作報告、製作儀表板時最常用的函式之一,既方便又好用,誠心推薦!
Thumbnail
你是否曾經遇到這樣的情況?手上有一張表格,需要根據某個欄位進行分類,但表格又很繁雜,如果手動一個個查找,就需要花費大量時間才能找到想要的資料,這樣實在是太沒效率又容易眼花。 今天,我就來教你一個FILTER 函數快速分類技巧,讓你輕鬆掌握數據,節省時間。
※什麼是資料 : 說明: 「資料」(information/data) 是網路應用程式的核心。 使用者分享的照片、電商販賣的產品,或是搜索引擎提供的餐廳評價都是資料。 主要特徵: 生活中任何基本的事實 (fact) 或是值 (value) 都可以被稱為資料。例如:你的名字、你的生日。 因