mysql索引底層

2021-10-23 17:13:47 字數 1399 閱讀 2331

資料結構

二叉樹:從父節點開始,大的往右,小的往左,當有序的增長就變成了單邊增長,就會對效能沒什麼提公升,不適合;

紅黑樹:二叉樹的平衡版,通過自旋等方式實現平衡;當資料很多時,紅黑樹的高度就變得很高,查詢一次需要多次的io不適合大資料查詢;

b樹和b+樹:乙個節點都可以存多個元素(多叉樹),以有序的方式平衡的排列;b樹和b+樹的區別在於,b+樹的非葉子節點不存資料,葉子節點中相鄰節點之間存在指標。在mysql中每個節點都有16k左右的大小,如果是b+樹在節點中只存索引列,例如bigint型別的索引,占用8位元組,再加上位址6位元組放在16k中就可以存放1000多個元素,(這裡設定我們一條記錄中所有值為平均1k左右的話),樹的高度為3層時就能存1000100016,只要通過三次io就可以找到非常大的資料,如果時b樹就變成了161616,存不了多少東西。每一層意味著一次io,io效率低,把資料io到記憶體中通過二分法查詢資料1000多個相對而言會快很多。所以mysql索引底層多採用了這種方式儲存效率高;

hash:通過hash運算,每個索引對應乙個hash值儲存在記憶體中。這樣的話,如果使用==或者in查詢會非常快;但是範圍查詢效率太低。b+樹已經做了排序(從左往右是從大到小),對範圍查詢效率高的多。

innodb和myisam

現在的主流已經變成了innodb型別的表了;是innodb的資料儲存在記憶體中是聚集索引儲存的

innodb和myisam主要差別:innodb的主鍵索引上把所有資料存在了葉子節點上,當根據主鍵來尋找時,直接從葉子節點就能拿到想要的資料(聚集索引),但是二級索引上不存有資料,這樣能減少儲存壓力,也能保證一致性;myisam則是在葉子節點中不存有資料只存有資料的磁碟位址,在找到資料後還需要回表根據這個位址去找資料(相對慢一些);

為什麼要自增整型主鍵

1、在innodb儲存資料的時候必須要通過b+樹來組織資料,如果沒有主鍵,就會去其他欄位找乙個唯一性的字段作為主鍵,或者自動生成乙個隱藏列作為主鍵;把這些操作交給資料庫來完成的顯然不合理,資料庫的儲存空間是很珍貴的;

2、整型和uuid等字串相比而言,整型數字比較大小要明顯快上很多,減少時間;

3、在底層索引的排列是以自增的方式從左往右排列的,這樣有利於範圍查詢。如果我們不是自增主鍵的話,就需要打亂原有的排序,比如中間插進去乙個,後面所有的資料可能都要重新排序,這樣明顯很慢;但是我們如果是自增這樣,直接往後面插乙個資料完全不用將資料重新排列;

聯合索引

比如聯合索引a,b,c聯合索引的底層是先將a有序的排列,然後在這個基礎上,將b有序的排列,最後再是c;所以如果引用聯合索引時,沒有按照這個順序有序的使用索引,那麼這個索引將無效化;

mysql底層 索引

mysql只是乙個應用軟體,不能直接讀取磁碟上的資料,當我們需要讀取某條資料的時候,mysql呼叫核心的乙個函式,告訴核心我要讀取某個資料,核心驅動磁柱磁頭去讀取資料,讀取資料之後怎麼返回裡,其實是把資料寫到記憶體中了 這個記憶體只是核心記憶體,並不是mysql記憶體 接下來再把資料copy到mys...

MySQL索引底層(二) 索引底層原理

聚集索引 上次我們講到了主鍵的索引,我們可以執行一下sql語句 explain select from t user where a 1 我們可以看到這條sql走的是主鍵的索引,而在mysql的innodb中,主鍵索引則是聚集索引,資料的物理順序與鍵值的邏輯 索引 順序相同,其實就是說主鍵索引跟其他...

mysql 索引 層數 mysql 索引底層

hash索引o 1 b 樹索引 o logn 為什麼紅黑樹出現了,因為防止某些情況下二叉排序樹退化為鍊錶 誕生了二叉排序平衡樹 樹的效能取決於樹的高度 為什麼db要用m路b樹,為了再降低樹的高度,減少db 磁碟io 次數,如果在記憶體中,紅黑樹效率更高 為什麼m不能無限大,因為會退化成有序陣列,無法...