數據庫索引是什麼?新華字典來幫你

學過服務器端開發的朋友必定知道,程序沒有數據庫索引也能夠運行。可是全部學習數據庫的資料、教程,必定會有大量的篇幅在介紹數據庫索引,各類後端開發工做的面試也必定繞不開索引,甚至能夠說數據庫索引是從後端初級開發跨越到高級開發的屠龍寶刀,那麼索引到底在服務端程序中起着怎樣的做用呢?面試

這篇文章是一系列數據庫索引文章中的第一篇,這個系列包括了下面四篇文章:數據庫

  1. 數據庫索引是什麼?新華字典來幫你 —— 理解
  2. 數據庫索引融會貫通 —— 深刻
  3. 20分鐘數據庫索引設計實戰 —— 實戰
  4. 數據庫索引爲何用B+樹實現? —— 擴展

這一系列涵蓋了數據庫索引從理論到實踐的一系列知識,一站式解決了從理解到融會貫通的全過程,相信每一篇文章均可以給你帶來更深刻的體驗。segmentfault

什麼是數據庫索引?

用一句話來描述:數據庫索引就是一種加快海量數據查詢的關鍵技術。如今還不理解這句話?沒關係,往下看,20分鐘之後你就能本身作出這樣的總結來了。後端

首先給你們看一張圖片服務器

image.png

這本書你們必定都很熟悉,小學入門第一課必定就是教小朋友們學習如何使用這本書。那這和咱們的數據庫索引有啥關係呢?彆着急,咱們翻開第一頁看看。學習

image.png

請你們注意右上角的那一排文字,原來目錄就是傳說中的索引呀!從前面的「一句話描述」咱們能夠知道,索引的目的就是爲了加快數據查詢。那麼咱們查字典時翻的第一個地方是哪裏呢,我相信大部分人都會先翻到拼音目錄,畢竟如今不少人都是提筆忘字了😂。spa

數據庫索引的做用和拼音目錄是同樣的,就是最快速的鎖定目標數據所在的位置範圍。好比咱們在這裏要查這個字,那麼咱們找到了Xx部分以後就能按順序找到xian這個拼音所在的頁碼,根據先後的頁碼咱們能夠知道這個字必定是在519頁到523頁之間的,範圍一會兒就縮小到只有4頁了。這相比咱們從頭翻到尾但是快多了,這時候就出現了第一個專業術語——全表掃描,也就是咱們說的從頭找到尾了。設計

果真,咱們在第521頁找到了咱們要找的「險」字。3d

image.png

那麼如今咱們就知道數據庫索引大概是一個什麼東西了:數據庫索引是一個相似於目錄這樣的用來加快數據查詢的技術。code

什麼是聯合索引?

相信你們都見過一些包含多個字段的數據庫索引,好比INDEX idx_test(col_a, col_b)。這種包含多個字段的索引就被稱爲「聯合索引」。那麼在多個字段上建索引能起到什麼樣的做用呢?下面仍是以新華字典爲例,來看看到底什麼是聯合索引。

新華字典裏還有一種目錄被稱爲「部首目錄」,下面能夠看到,要使用這個目錄咱們首先會根據部首的筆畫數找到對應該能的部分,而後能夠在裏面找到咱們想找的部首。好比若是咱們仍是要找字所在的位置:

image.png

找到部首後,右邊的頁碼還不是字真正的頁碼,咱們還須要根據右邊的頁碼找到對應部首在檢字表中的位置。找到第93頁的檢字表後咱們就能夠根據字餘下的筆畫數(7畫)在「6-8畫」這一部分裏找到字真正的頁碼了。

image.png

在這個過程當中,咱們按順序使用了「兩個目錄」,一個叫作「部首目錄」,一個叫作「檢字表」。而且咱們能夠看到上圖中檢字表的內容都是按部首分門別類組織的。這兩個部分合在一塊兒就是咱們在本節討論的主題——聯合索引。即經過第一個字段的值(部首)在第一級索引中找到對應的第二級索引位置(檢字表頁碼),而後在第二級索引中根據第二個字段的值(筆畫)找到符合條件的數據所在的位置(字的真正頁碼)。

最左前綴匹配

從前面使用部首目錄的例子中能夠看出,若是咱們不知道一個字的部首是什麼的話,那基本是沒辦法使用這個目錄的。這說明僅僅經過筆畫數(第二個字段)是沒辦法使用部首目錄的。

這就引伸出了聯合索引的一個規則:聯合索引中的字段,只有某個字段(筆畫)左邊的全部字段(部首)都被使用了,才能使用該字段上的索引。例如,有索引INDEX idx_i1(col_a, col_b),若是查詢條件爲where col_b = 1,則沒法使用索引idx_i1

可是若是咱們知道部首可是不知道筆畫數,好比不知道「橫折豎彎勾」是算一筆仍是兩筆,那咱們仍然可使用「部首目錄」部分的內容,只是要把「檢字表」對應部首裏的全部字都看一遍就能找到咱們要找的字了。

這就引伸出了聯合索引的另外一個規則:聯合索引中的字段,即便某個字段(部首)右邊的其餘字段(筆畫)沒有被使用,該字段以前(含)的全部字段仍然能夠正常使用索引。例如,有索引INDEX idx_i2(col_a, col_b, col_c),則查詢條件where col_a = 1 and col_b = 2在字段col_acol_b上仍然能夠走索引。

可是,若是咱們在肯定部首後,不知道一個字究竟是兩畫仍是三畫,這種狀況下咱們只須要在對應部首的兩畫和三畫部分中找就能夠了,也就是說咱們仍然使用了檢字表中的內容。因此,使用範圍條件查詢時也是可使用索引的。

最後,咱們能夠完整地表述一下最左前綴匹配原則的含義:對於一個聯合索引,若是有一個SQL查詢語句須要執行,則只有從索引最左邊的第一個字段開始到SQL語句查詢條件中不包含的字段(不含)或範圍條件字段(含)爲止的部分纔會使用索引進行加速。

這裏出現了一個以前沒有提到的點,就是範圍條件字段也會結束對索引上後續字段的使用,這是爲何呢?具體緣由的解釋涉及到了更深層次的知識,在接下來的第二篇文章的最後就能夠找到答案。

什麼是彙集索引?

從上文的部首目錄和拼音目錄同時存在可是實際的字典內容只有一份這一點上能夠看出,在數據庫中一張表上是能夠有多個索引的。那麼不一樣的索引之間有什麼區別呢?

咱們在新華字典的側面能夠看到一個V字形的一個個黑色小方塊,有不少人都會在側面寫上A, B, C, D這樣對應的拼音字母。由於字典中全部的字都是按照拼音順序排列的,有時候直接使用首字母翻開對應的部分查也很快。

image.png

像拼音目錄這樣的索引,數據會根據索引中的順序進行排列和組織的,這樣的索引就被稱爲彙集索引,而非彙集索引就是其餘的通常索引。由於數據只能按照一種規則排序,因此一張表至多有一個彙集索引,但能夠有多個非彙集索引。

在MySQL數據庫的InnoDB存儲引擎中,主鍵索引就是彙集索引,全部數據都會按照主鍵索引進行組織;而在MyISAM存儲引擎中,就沒有彙集索引了,由於MyISAM存儲引擎中的數據不是按索引順序進行存儲的。

相關文章
相關標籤/搜索