一. 引言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)的對應記錄起來的話,每次能夠直接找到數據的位置,那麼速率則會大大加快,如同咱們看書時的目錄同樣,不須要講前面的全部內容都過一遍。以下圖所示:
到如今爲止,咱們已經對索引的概念和實現方式有了基本的認識 ,如今咱們要談論兩個概念,通常存在於操做系統中,一個是時間局部性原理,一個是空間局部性原理。
漸進複雜度是遞增的!!!
二叉樹是線性增長的,並且每一個節點只能放一個數據,每查詢一個數據,都會從頭至尾執行一次,若是查詢一次算一個IO的話,查詢第1萬條數據就要執行1萬次IO,顯然是不合理的。
紅黑樹:
漸進複雜度是遞增的!!!
雖然高度減小了,可是高度仍是不可控的,IO執行次數仍是過多
B + tree
→ → →
在這裏咱們發現b+ tree的高度竟然是不變的,你們看這些圖,若是想查某一id 的值,只須要查兩次,好比最後一張圖,查id爲1 的: 0003 -> 0002 ->0001 ,其他的也都是查兩次,這樣咱們能夠獲得結論:
在B + Tree中,漸進複雜度是恆定不變的!!!
在B + Tree中,漸進複雜度是恆定不變的!!!
在B + Tree中,漸進複雜度是恆定不變的!!!
重要的事說三遍