Mysql索引深入理解


 

一.  引言

       Mysql 我們平常用的很多,了解的很多,今天別的不說,直接說mysql的底層是什么,說到底層,就想到數據結構,那么,mysql的數據結構是什么呢? 是B + tree 。那么數據庫中的索引是什么呢?

二.  索引是什么?

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

接下來我們去看看索引到底是如何高效獲取數據的

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

id        name  

1         tom

2         jerry

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中,漸進復雜度是恆定不變的!!!

 重要的事說三遍

 

 

 

 

 

 
 
 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM