Mysql索引底層資料結構

2021-08-30 15:54:26 字數 3043 閱讀 8890

想要了解索引,首先要知道索引到底是什麼呢

*索引是幫助mysql高效獲取資料的排好序的資料結構;通俗來講就好比喻一本書,那這本書的目錄就好比做索引;

*索引儲存在檔案裡(儲存引擎是myisam的索引檔案儲存在 *.myi檔案中,儲存引擎是innodb的索引檔案儲存在 *.idb檔案中)

通常資料庫中的資料就是存在硬碟上的,表存磁碟檔案,沒有索引就得一行一行掃瞄檔案,每一行得記錄在檔案裡不一定連續的,如果要找到指定的資料或許很耗時間,如下圖如果查詢col1等於7的資料就會很耗時間的。

在這簡單說一下磁碟的儲存原理

尋道時間(速度慢,費時)

旋轉時間(速度較快)

資料就是儲存在扇區中的磁軌中,與主存不同,磁碟i/o存在機械運動耗費,因此.因此磁碟10的時間消耗是巨大的。傳入檔案位址,即確定要讀的資料在哪個磁軌。哪個扇區。為了讀取這個扇區的資料,需要將磁頭放到這個房風上大』 為了實現這一點,磁頭需要移動對準相應磁軌,這個過程叫做目治 然後磁碟旋轉將目標扇區旋轉到碰頭下,這個過程耗費的時間。這個過程耗費的時間叫做旋轉時間。

(會單邊增長,深度較大)

(會自動平衡,但深度還是不可控制的)

(通過hash演算法,把某個索引換算為hash值作為磁碟儲存這條資料的位址,正常查詢只需要通過一次hash計算就能獲取值,但hash沒有查詢範圍的值,如id>1就不能查詢了)

mysql中也有hash的索引儲存方式,不過不常用

。度(degree)-節點資料儲存的個數

。葉節點具有相同的深度

。葉節點的指標為空

。葉節點的資料key從左到右遞增排列

。非葉子節點不儲存data,只儲存key,這樣子增加度,度增加,樹的深度隨之減少

。葉子節點不儲存指標

。順序訪問指標,提高區間的訪問效能。如要查詢》30的資料,如果30和49之間沒有指標要這樣區間查詢效能會減低很多,如果有指標指著,這樣子查詢只要查指標就可以了

。 一般使用磁碟i/0次數評價索引結構的優劣

。預讀:磁碟一般會順序向後讀取一定長度的資料(頁的整數倍)放入內。存區域性性原理:當乙個資料被用到時,其附近的資料也通常會馬上被使用

。b+tree節點的大小設為等於乙個頁,每次新建節點直接申請-乙個頁的空間,這樣就保證乙個節點物理上也儲存在乙個頁裡,就實現了乙個節點的載入只需-一次i/0

。b+tree的度一般會超過100,因此h非常小(一般為3到5之間)

。myisam索引檔案和資料檔案是分離的

myisam的主鍵索引

myisam的非主鍵索引(和主鍵索引沒什麼區別)

myisam儲存引擎,索引查詢先先通過索引查詢到葉子節點下data(檔案指標),然後通過檔案指標定位到儲存的資料

。資料檔案就是索引檔案(資料和索引兩者檔案是合併在一起的 *.idb)

innodb的主鍵索引

innodb非主鍵索引

兩者又很大的差別

。表資料檔案本身就是索引檔案

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

。聚集索引-葉節點包含完整的資料記錄

。為什麼innodb表必須包含主鍵,並且推薦使用整形的自增主鍵

*因為innodb的資料檔案本身要按主鍵聚集,所以innodb要求表必須有主鍵(myisam可以沒有), 如果沒有 顯式指定,則mysql系統會自動選擇乙個可以唯一 標識資料記錄的列作為主鍵,如果不存在這種列,則mysql自動為innodb表生成一乙個隱含字段作為主鍵,這個字段長度為6個位元組,型別為長整形。innodb的輔助索data域儲存相應記錄主鍵的值而不是位址,便於維護與資料一致性索引如果是字串以ascii碼作為比較準則

*為什麼不建議使用過長的字段作為主鍵,因為所有輔助索引都引用主索引,過長的主索引|會令輔助索引|變得過大。再例如,用非單調的字段作為主鍵在innodb中不是個好主意,因為innodb資料檔案本身是一顆b+tree,非單調的主鍵會造成在插入新記錄時資料檔案為了維持b + tree的特性而頻繁的**調整,甚至有的目標頁面可能已經被回寫到磁碟上而從快取中清掉,此時又要從磁碟上讀回來,這增加了很多開銷,同時活致的放頻繁的移動、分頁操作造成了大量的碎片,得到了不夠緊湊的索引結構,十分低效,而使用自增字段作為主鍵則是乙個很好的選擇。

。為什麼非主鍵的索引結構葉子節點儲存的是主鍵值

*因為為了一致性和節省儲存空間,因為如果要插入資料的時候不僅會要維護主鍵索引,還要維護二級索引,如果在非主鍵索引中也儲存資料,就得保持資料的一致性,如果還有分布式呢,這樣子就大大增加了維護索引的力度。

它是把所有的索引都存在同乙個節點中,查詢的時候先查第乙個索引,如果找到了就不需要繼續下去,如果有多個相同的(10001)就繼續查第二索引(assistant),如果還是一樣就繼續招下面的索引。

MySQL索引底層資料結構詳情

目錄 為什麼是b 樹而不是b樹?首先看看b樹和b 樹在結構上的區別 b樹結構 b 樹 可以看到 首先需要了解聚簇索引和非聚簇索引。聚簇索引 在聚簇索引中,葉子頁包含了行的全部資料,節點頁值包含索引列。innodb通過主鍵聚集資料,如果沒有定義主鍵則選擇乙個唯一的非空索引列代替 如果沒有這樣的索引,i...

索引的底層資料結構

索引的底層資料結構有 1 樹tree,準確的說是b 樹 2 hash 時間複雜度對比 hash的時間o 1 tree的o logn 為什麼索引採用b 樹,而不採用hash這種結構?hash這種結構對與獲取單條記錄時的查詢效率是要比b 樹效率要高的,但是對與資料的範圍查詢效率就很低,特別是對於資料量大...

MySql索引底層資料結構與演算法

一 索引資料結構 索引是幫助mysql高效獲取資料的排好序的資料結構 二叉樹 特點 左子樹小於右子樹 缺點 如果儲存自增資料,二叉樹會退化成煉表,查詢效率低 紅黑樹 特點 自平衡二叉樹,樹高相對平衡,不會出現極端情況 性質1.節點是紅色或黑色。性質2.根節點是黑色。性質3.所有葉子都是黑色。葉子是n...