MySQL索引筆記(索引的底層原理)

2021-10-19 19:11:08 字數 1451 閱讀 8377

索引是幫助mysql高效獲取資料的排好序的資料結構

索引資料結構

二叉樹;

紅黑樹;

hash表;

b-tree;

資料結構**(

紅黑樹在資料量大的時候沒有優勢(樹的高度不可控)

1.葉節點具有相同的深度,葉節點的指標為空

2.所有索引元素不重複

3. 節點中的資料索引從左到右遞增排列

4. 非葉子節點不儲存data,只在葉子節點儲存

5. 沒有指標,在範圍查詢的時候沒有指標定位,查詢速度相應會慢

1.非葉子節點不儲存data,只儲存索引(冗餘),可以放更多的索引

2.葉子節點包含所有索引字段

3.葉子節點用指標連線,提高區間訪問的效能

4.節點中的資料從左到右依次遞增排列(排好序)

5. 樹的高度由非葉子節點儲存的資料決定

6. b+tree的指標: 在範圍查詢的時候可以快速定位符合條件的資料,mysql底層的 指標是雙箭頭型別指標

7. 在維護資料的時候會自動排序

1.對索引的key進行一次hash計算就可以定位出資料儲存的位置

2.很多時候hash索引要比b+樹索引更高效

3.僅能滿足「=」,「in」 不支援範圍查詢

4.hash衝突問題

5.理想情況下可能只需定位一次就可以定位到節點(hash運算速度快)

6.hash結構的限制:在查詢範圍的時候定位不了,還是需要全表掃瞄

1…ibd檔案:

2.表資料檔案本身就是按b+tree組織的乙個索引結構檔案

3.聚集索引-葉子節點包含了乙個完整的資料記錄

4.非聚集索引-索引和資料檔案是分離儲存的

5.就單純索引角度來說聚集索引的查詢速度要快,非聚集索引需要跨檔案查詢,速度相對會慢

6.在使用二級索引時要先查找到主鍵,再去查詢聚簇索引

1.一般是不推薦建立多個單個索引,一般會使用聯合索引實現單個索引

2.索引最左字首原理:通過琢漸比較字段進行維護,在使用是需要按照建索引的順序進行使用,不能跳過最左邊的索引條件(多個欄位的聯合索引)

3.為什麼要使用最左字首原理:因為在資料儲存中資料時按照順序排序的,一旦跳過最左字首就相當於資料不是排好序的,意味著在查詢的時候需要全表查詢

1.為什麼建議innodb表必須建主鍵,而且推薦使用整形的自增主鍵?

解答:.iba在構建的時候必須用b+tree儲存,使用主鍵可以直接使用主鍵構建b+tree,不使用主鍵在構建b+tree時會去找錶中字段中某例不存在相同資料的列進行構建,或者重新新增乙個**的字段,用於構建b+tree。整形的自增主鍵相對需要的記憶體要小,對節約硬碟的空間有很大的幫助。自增:在插入資料的時候只需往已有的資料之後插入,不會打亂已有的資料節點

2.為什麼非主鍵索引結構葉子節點儲存的是主鍵值?(一致性和節省儲存空間)

解答:主鍵索引在維護資料時,可以減少索引資料的複雜度,節約儲存空間,在字段比較比較複雜是可以建立二級索引

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不能無限大,因為會退化成有序陣列,無法...

mysql底層 索引

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