索引是幫助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...