一. 引言
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)的對應記錄起來的話,每次可以直接找到數據的位置,那么速率則會大大加快,如同我們看書時的目錄一樣,不需要講前面的所有內容都過一遍。如下圖所示:
到現在為止,我們已經對索引的概念和實現方式有了基本的認識 ,現在我們要談論兩個概念,一般存在於操作系統中,一個是時間局部性原理,一個是空間局部性原理。

漸進復雜度是遞增的!!!
二叉樹是線性增加的,而且每個節點只能放一個數據,每查詢一個數據,都會從頭到尾執行一次,如果查詢一次算一個IO的話,查詢第1萬條數據就要執行1萬次IO,顯然是不合理的。
紅黑樹:
漸進復雜度是遞增的!!!
雖然高度減少了,但是高度還是不可控的,IO執行次數還是過多
B + tree
→
→
→
在這里我們發現b+ tree的高度居然是不變的,大家看這些圖,如果想查某一id 的值,只需要查兩次,比如最后一張圖,查id為1 的: 0003 -> 0002 ->0001 ,其余的也都是查兩次,這樣我們可以得到結論:
在B + Tree中,漸進復雜度是恆定不變的!!!
在B + Tree中,漸進復雜度是恆定不變的!!!
在B + Tree中,漸進復雜度是恆定不變的!!!
重要的事說三遍