一文讀懂資料庫索引

2020-12-17 技術大咖秀

一、啥是索引

資料庫索引是建立在表的一列或多個列上的輔助對象,用於加快數據的檢索,類似於書籍的索引。當資料庫表中的數據越來越多的時候,查詢效率變慢,這時候我們就需要資料庫索引了。

優點:

加快數據的查詢速度;唯一索引可以確保數據的唯一性;可以加速表和表之間的連接,實現表和表之間的參照完整性;使用分組和排序子句進行數據檢索時,可以顯著減少查詢中分組和排序的時間。缺點:

佔用數據表以外的物理存儲空間;需要對索引進行維護;表進行更新操作時,索引需要被重建,降低了數據的維護速度。二、索引的分類

1、普通索引(INDEX)

create index index_name on table_name(col_name)

普通索引是最基本的索引,沒有什麼特別限制,主要是為了增加這個欄位的查詢速度。

2、唯一索引(UNIQUE)

create unique index user_id_index on user(id)

唯一索引是強調表中數據記錄的唯一性,允許NULL值。

3、主鍵索引(PRIMAY KEY)

主鍵索引是一種特殊的唯一索引,將索引建在主鍵上,不允許NULL值。

4、組合索引

組合索引是多列值組成一個索引,專門用於組合搜索,效率大於索引合併。

5、全文索引(FULLTEXT)

全文索引對文本的內容進行分詞搜索。

三、索引的實現方式

1、 B+樹

B+樹和紅黑樹差不多,都是是為了儘量保持樹的平衡。但紅黑樹是二叉樹,B+樹是多叉樹,節點下面可以有多個子節點,資料庫會默認設置子節點數的一個最大值,這個值不會太小,所以B+樹一般來說比較矮胖,而紅黑樹就比較瘦高。

如果經常需要同時對兩個欄位進行and查詢,那麼使用兩個單獨索引不如建立一個複合索引,因為兩個單獨索引通常資料庫只能使用其中一個,而使用複合索引因為索引本身就對應到兩個欄位上的,效率會有很大提高。

2、散列索引

散列索引,又叫哈希索引,是通過散列函數來定位的一種索引。不過很少有單獨使用散列索引的,反而是散列文件組織用的比較多。

散列文件組織就是根據一個鍵通過散列計算把對應的記錄都放到同一個槽中,這樣的話相同的鍵值對應的記錄就一定是放在同一個文件裡了,也就減少了文件讀取的次數,提高了效率。

散列索引呢就是根據對應鍵的散列碼來找到最終的索引項的技術,其實和B樹就差不多了,也就是一種索引之上的二級輔助索引,我理解散列索引都是二級或更高級的稀疏索引,否則桶就太多了,效率也不會很高。

3、位圖索引

位圖索引是一種針對多個欄位的簡單查詢設計一種特殊的索引,適用範圍比較小,只適用於欄位值固定並且值的種類很少的情況,比如性別,只能有男和女,或者級別,狀態等,並且只有在同時對多個這樣的欄位查詢時才能體現出位圖的優勢。

create bitmap index idx_name on table(col_name)

位圖的基本思想就是對每一個條件都用0或者1來表示,如有5條記錄,性別分別是男,女,男,男,女,那麼如果使用位圖索引就會建立兩個位圖,對應男的10110和對應女的01001,這樣做有什麼好處呢,就是如果同時對多個這種類型的欄位進行and或or查詢時,可以使用按位與和按位或來直接得到結果了。

四、創建索引的原則

凡事都有兩面,有利必有弊。建立索引也是同樣的道理,我們在增加了檢索速度的同時,也會損耗相當的更新性能。所以建立索引前,要慎重的討論清楚,確實需要的時候再加。

應該創建索引的情況:

經常需要搜索的列,加快查詢速度;主鍵列上,強調唯一性;經常用在連接的列,這些列主要是一些外鍵,可以加快連接的速度;經常需要根據範圍進行搜索的列上創建索引,因為索引已經排序,其指定的範圍是連續的;經常需要排序的列上創建索引,因為索引已經排序,這樣查詢可以利用索引的排序,加快排序查詢時間;經常使用在WHERE子句中的列上面創建索引,加快條件的判斷速度。不應該創建索引的情況:

在查詢中很少使用或者參考的列不應該創建索引。因為很少使用到,並不能提高查詢速度。相反,由於增加了索引,反而降低了系統的維護速度和增大了空間需求。只有很少數據值的列也不應該增加索引。這是因為,由於這些列的取值很少,例如人事表的性別列,在查詢的結果中,結果集的數據行佔了表中數據行的很大比例,即需要在表中搜索的數據行的比例很大。增加索引,並不能明顯加快檢索速度。定義為text, image和bit數據類型的列不應該增加索引。這是因為,這些列的數據量要麼相當大,要麼取值很少。當修改性能遠遠大於檢索性能時,不應該創建索引。這是因為,修改性能和檢索性能是互相矛盾的。當增加索引時,會提高檢索性能,但是會降低修改性能。當減少 索引時,會提高修改性能,降低檢索性能。因此,當修改性能遠遠大於檢索性能時,不應該創建索引。

相關焦點

  • 索引,一文搞定 | 資料庫系列
    前段時間寫資料庫內核比較多,最近又有朋友問索引的應用了,其實相關索引應用之前或多或少寫過
  • 「中文學術集刊索引資料庫」正式上線
    【來源:光明網】4月9日,由南京大學中國社會科學研究評價中心打造的「中文學術集刊索引資料庫」正式上線。該資料庫的推出是在CSSCI期刊索引和圖書索引建成之後的又一重要成果,標誌著我國人文社會科學科研評價體系和方法的改革又向前邁出了重要一步。
  • 一文讀懂內存資料庫
    01Redis雖然好,但阿里云為何還力推Tair全球雲觀察分析指出,Key-Value資料庫按照鍵值對的形式進行組織、索引和存儲,因而帶來了內存資料庫在具體應用中新的提升。2009年4月,作為一款真正的企業級雲內存資料庫產品,Tair正式誕生。隨即應用在淘寶核心業務系統,隨後逐漸進入阿里其他核心業務系統。Tair最早的設計思路源自Redis,很多功能設計也參考了Redis。
  • 深入淺出資料庫索引
    每每面試,都會問到:你是如何使用索引的?聚集索引和非聚集索引的區別是什麼?為什麼使用索引會查詢快?等等等等一系列的索引問題,恰巧平時使用索引都是哪個欄位常用做查詢就加上索引,不知其所以然。回來深入研究,把學習筆記和大家分享,希望給你帶來幫助。
  • 一文看懂聚集索引和非聚集索引的區別
    及時獲取有趣有料的技術文章原文地址:https://blog.csdn.net/riemann_/article/details/90324846一、深入淺出理解索引結構實際上,可以把索引理解為一種特殊的目錄。
  • 一文讀懂如何解決MySQL資料庫超時配置問題
    打開APP 一文讀懂如何解決MySQL資料庫超時配置問題 發表於 2017-10-25 16:28:27 在過程中我們發現在MySQL資料庫中出翔了許多的超時的配置,那麼它有哪些超時配置,它會有什麼影響嗎?今天的文章就讓我來大家來分析一下。   1.
  • MySQL資料庫SQL優化技巧四之索引
    本篇將介紹索引的概念。剛開始都是一些概念性的東西,需要去了解,可能是比較枯燥乏味的,但是這些概念的東西還是需要知道的,了解來龍去脈才能知其所以然。大概還有兩篇就能到真正的乾貨環節。1索引的基礎知識用戶對數署庫最頻繁的操作是數據查詢。-般情況下,資料庫在進行查詢操作時,霜嬰對整個表進行搜索。
  • 為什麼資料庫使用有序索引,而程式設計師卻在使用哈希表?
    為什麼程序和資料庫之間的「默認」選擇會產生不同呢?然而,資料庫默認總是會使用有序索引,通常是B樹。為什麼程序和資料庫之間的「默認」選擇會產生不同呢?說到底兩者都是為了同一個目標:訪問數據。一年前,我曾就這個問題在Twitter上發表了推文,並得到了許多有趣的答案。下面就來總結一下我得到的答案。常見的答案是,當在內存中存儲數據時,哈希表的效率很高,而B樹的設計旨在以塊的形式訪問較慢的存儲。然而,這不是決定性的屬性。
  • 千萬級MySQL資料庫這樣建索引可以讓你的資料庫飛起來
    另外,過多的複合索引,在有單欄位索引的情況下,一般都是沒有存在價值的;相反,還會降低數據增加刪除時的性能,特別是對頻繁更新的表來說,負面影響更大。總的來說,小型表肯定不建索引,或者資料庫記錄在億條數據級以上,還是建議使用非關係型資料庫。
  • 超全的資料庫建表、SQL、索引規範
    因為工作崗位的原因,負責制定了關於後端組資料庫的規約規範,作為所有產品線的規範,歷經幾版的修改,最終形成下邊的文本,規範在整個後端執行也有大半年的時間,對於整個團隊在開發階段就減少不恰當的建表語句、錯誤SQL、錯誤的索引有積極的意義,故分享出來給大家參考。
  • 獨家 | 一文讀懂Adaboost
    【集成學習】系列往期回顧:獨家 | 一文讀懂集成學習(附學習資源) 參考資料:1. 李航.《統計學習方法》2. 周志華.《機器學習》3. 曹瑩,苗啟廣,劉家辰,高琳. AdaBoost 算法研究進展與展望.
  • MySQL資料庫SQL優化技巧五之非聚集索引
    和最基本的索引的創建語法。索弓|的創建與銷毀在SQL中,創建索引是由CREATE INDEX關鍵字實現的。但在不同的資料庫管理系統中,CREATE INDEX語句有不同形式的擴展。索引的銷毀則是由DROP INDEX關鍵字實現的。
  • SQL-資料庫索引選擇B+樹的原因
    在進一步分析為什麼MySQL資料庫索引選擇使用B+樹之前,我相信很多小夥伴對數據結構中的樹還是有些許模糊的,因此我們由淺入深一步步探討樹的演進過程,在一步步引出B樹以及為什麼MySQL資料庫索引選擇使用B+樹!學過數據結構的一般對最基礎的樹都有所認識,因此我們就從與我們主題更為相近的二叉查找樹開始。
  • 資料庫面試題:唯一索引和普通索引選哪個?MySQL的優化 -開課吧
    資料庫面試題唯索引和普通索引選擇哪個?唯索引和普通索引在讀取的時候效率基本差不多,普通索引差了點點。主要是判斷和特殊情況下的次IO。寫的時候,普通索引可以利change buffffer適合寫多讀少,唯索引要快。以業務為前提,如果要求唯,就要選擇唯索引。如果已經保證列的唯,我們儘量選擇普通索引,然後把 change buffffer 調。
  • 一文看懂索引為什麼能提供查詢性能
    前言最近,有個女孩子問我提高資料庫查詢性能有什麼立竿見影的好方法?這簡直是一道送分題,我自豪且略帶鄙夷的說,當然是加「索引」了。她又不緊不慢的問,索引為什麼就能提高查詢性能。這還用問,索引就像一本書的目錄,用目錄查當然很快。她失望地搖了搖頭,你說的只是一個類比,可為什麼通過目錄就能提高查詢速度呢。唉,對啊,通過書目可以快速查詢,這只是一個現象,真正原因到底是什麼呢。
  • 資料庫索引的知識點,你所需要了解的都在這兒了
    資料庫索引,相信大家都不陌生吧。索引是對資料庫表中一列或多列的值進行排序的一種結構,使用索引可快速訪問資料庫表中的特定信息。首先聲明一下,本文索引的知識點全部是基於MySQL資料庫索引的優缺點優點:1.大大加快數據的查詢速度2.唯一索引可以保證資料庫表每一行的唯一性
  • 資料庫支招:Oracle創建/重建和刪除索引
    為了方便廣大考生更好的複習,幫考網綜合整理提供了Oracle認證:Oracle創建/重建和刪除索引,以供各位考生考試複習參考,希望對考生複習有所幫助。Oracle創建、重建和刪除索引創建索引:SQL》 create index mcconf_index on mc$ma_warn_config (NAME);Index created.
  • 超全的資料庫建表/SQL/索引規範,建議貼在工位上!
    「一、建表規約」「【強制】(1) 存儲引擎必須使用InnoDB」解讀:InnoDB支持事物、行級鎖、並發性能更好,CPU及內存緩存頁優化使得資源利用率更高。「【強制】(4) 資料庫表、表欄位必須加入中文注釋」解讀:大家都別懶。
  • 《天然氣地球科學》被美國《工程索引》(EI)資料庫收錄
    Elsevier二次文獻數據部(EI中國辦事處)通知,美國《工程索引》(Engineering Index,EI)資料庫自2013年起將《天然氣地球科學》(雙月刊)雜誌作為收錄源期刊。Elsevier二次文獻數據部主要工作是為Elsevier二次文獻資料庫(包括Scopus、Ei Compendex、Geobase、Embase 等)處理中國期刊的二次文獻數據(文章的題目,作者信息,摘要和參考文獻)。《工程索引》資料庫,創建於1884年,是目前全球最著名的三大文摘類檢索資料庫(SCI、EI、INSPPC)之一。
  • 從原理到優化,深入淺出資料庫索引 - 計算機java編程
    MySQL官方對索引的定義為:索引(Index)是幫助MySQL高效獲取數據的數據結構。資料庫查詢是資料庫的最主要功能之一,我們都希望查詢數據的速度能儘可能的快,因此資料庫系統的設計者會從查詢算法的角度進行優化,這篇文章對索引做一個系統的梳理,希望對大家有幫助。