Mysql索引深刻理解

 

一.  引言mysql

       Mysql 咱們日常用的不少,瞭解的不少,今天別的不說,直接說mysql的底層是什麼,說到底層,就想到數據結構,那麼,mysql的數據結構是什麼呢? 是B + tree 。那麼數據庫中的索引是什麼呢?sql

二.  索引是什麼?數據庫

數據庫的目的是爲了存儲數據,那麼索引的概念是什麼呢? 最合理的解釋,也是官方的解釋就是:索引是幫助MySQL高效獲取數據的數據結構。關鍵就是這個數據結構,什麼目錄的解釋都是不合理的。數據結構

接下來咱們去看看索引究竟是如何高效獲取數據的性能

先建一張student表簡單的存放數據網站

id        name  spa

1         tom操作系統

2         jerryblog

3         jack索引

回到好久以前,你們先設想一下,若是以前沒有mysql這種RDBMS(關係數據庫管理系統)時,這些表存放在哪裏呢?確定是存放在文件之中。

那麼,執行一個簡單的查詢,如 select  *   from   student   where   id  =  1;

若是要執行逐條篩選的話會特別慢,好比要找到 id =100的,就要篩選100條數據,顯然是不合理的,那麼索引到底是如何高效獲取數據的。

文件系統

首先,咱們先看一下咱們電腦中的文件系統,數據庫數據是如何保存在文件中的

文件系統重要包括柱面 、 磁道和扇區,這是一種比較原始的存儲方式

        

 

如圖所示,若是每次查詢都要從頭轉到尾的檢索,效率性能都會很低,那麼若是咱們將id 與這條數據在扇區的位置記錄(address)的對應記錄起來的話,每次能夠直接找到數據的位置,那麼速率則會大大加快,如同咱們看書時的目錄同樣,不須要講前面的全部內容都過一遍。以下圖所示:

 

到如今爲止,咱們已經對索引的概念和實現方式有了基本的認識 ,如今咱們要談論兩個概念,通常存在於操做系統中,一個是時間局部性原理,一個是空間局部性原理。

時間局部性原理(Temporal Locality):若是一個信息項正在被訪問,那麼在近期它極可能還會被再次訪問。
程序循環、堆棧等是產生時間局部性的緣由。
空間局部性原理(Spatial Locality):在最近的未來將用到的信息極可能與如今正在使用的信息在空間地址上是臨近的。
 
時間局部性原理和空間局部性原理打個比方就至關於快遞員送快遞同樣,通常一個快遞員只負責一片區域快遞的配送,這個是空間局部性原理,這些快遞通常都要在2個小時內送完,這是時間局部性原理。
爲何在索引中要去引入這兩個概念呢?由於用索引去查詢時,存在這種局部性的概念,好比執行語句   select  *   from   student   where   id  =  1;可能會在5分鐘內再次調用該語句,這樣咱們就能夠把該查詢放入內存中去,這就是時間局部性原理。咱們執行了id = 1 ,可能還會去執行 id= 2,id =3 這些語句,那麼咱們就去把這些相似查詢的扇面所有查詢一次,這就是空間局部性原理 (送快遞不會一次只拿一個快遞)。你們先大概瞭解一下這兩個概念,咱們繼續往下走。
 
 
三.  爲何Mysql數據庫要用B + tree 這種數據結構呢?
首先咱們要先申明一個概念,判斷索引的標準是什麼?是IO漸進複雜度(就是IO執行的次數)
平時咱們存放數據的數據結構有不少種,有hash,有紅黑樹等等,那麼爲何咱們要捨棄這些經常使用的數據結構而去用B + tree呢?咱們依次去分析
 
Hash  hash(id)
用hash這種方式存儲效率很高,經過key和value能夠很快的獲取到對應的值,那爲何咱們不去用呢?由於當執行select  *   from   student   where   id  >  1; 這種sql的時候,hash就顯得蒼白無力了
 
在各類樹的數據結構中,爲何不用普通的二叉樹,爲何不用紅黑樹,而要用B+tree呢?咱們從國外的一個網站上去清楚直觀的去看一下各類數據結構,就能夠知道爲何要使用B+tree了。
二叉樹:
 

漸進複雜度是遞增的!!!

二叉樹是線性增長的,並且每一個節點只能放一個數據,每查詢一個數據,都會從頭至尾執行一次,若是查詢一次算一個IO的話,查詢第1萬條數據就要執行1萬次IO,顯然是不合理的。

紅黑樹:

漸進複雜度是遞增的!!! 

雖然高度減小了,可是高度仍是不可控的,IO執行次數仍是過多

B + tree

 →       →      →    

 

 在這裏咱們發現b+ tree的高度竟然是不變的,你們看這些圖,若是想查某一id 的值,只須要查兩次,好比最後一張圖,查id爲1 的: 0003  ->  0002  ->0001 ,其他的也都是查兩次,這樣咱們能夠獲得結論:

在B + Tree中,漸進複雜度是恆定不變的!!!

在B + Tree中,漸進複雜度是恆定不變的!!!

在B + Tree中,漸進複雜度是恆定不變的!!!

 重要的事說三遍

相關文章
相關標籤/搜索