mysql 稀疏 稀疏索引和稠密索引你了解嗎?

2021-10-17 16:56:32 字數 1174 閱讀 4177

背景

最近參加了乙個面試,面試官先問了mysql的資料庫的索引的底層資料介面,我回答了:平時都用的是innodb引擎,所以其底層的索引資料型別是b+樹。面試官問我用沒用過稀疏索引。當時就懵了,聚集索引,非聚集索引,主鍵索引,覆蓋索引等等,我也沒聽過什麼是稀疏索引。我反問了一下 面試官這個索引型別是mysql新出的嗎,我不太了解也沒有怎麼用過,面試官模糊的給我回答了一下:乙個占用空間小查詢效率相對低,乙個查詢效率高,儲存空間比較大,用法是在建立索引的時候進行設定引數。我坦白道:不清楚,下去了解一下。

稠密索引和稀疏索引

稀疏索引: 在稀疏索引中,不會為每個搜尋關鍵字建立索引記錄。此處的索引記錄包含搜尋鍵和指向磁碟上資料的實際指標。要搜尋記錄,我們首先按索引記錄進行操作,然後到達資料的實際位置。如果我們要尋找的資料不是我們通過遵循索引直接到達的位置,那麼系統將開始順序搜尋,直到找到所需的資料為止。

innodb底層儲存資料

b+樹索引的兩種型別聚集索引: 通過每張表的主鍵順序進行存放,其葉子節點存放的是這張表的每行完整資料。也正是我們有時稱呼的主鍵索引(對比一下稠密索引)

非聚集索引(輔助索引,二級索引):

其葉子節點並不包含行記錄的全部資料,其葉子結點的資料報含書籤和鍵值(用於建立索引的字段值),書籤的作用是找與索引相對應的行資料。也就是對應聚集索引的主鍵值。你是否有想過對應的描述的索引值

關係看完稀疏索引和稠密索引還有聚集索引和非聚集索引的概念,我們是否能看出他們有什麼關係。

聚簇索引(主鍵索引)是稠密索引,因為主鍵索引是所有的值都不為空,每乙個搜尋碼都會有對應的行記錄。

非聚集索引是稀疏索引,非聚集索引有唯一索引,普通索引,復合索引。他們的特徵就是不會為表得每個值建立搜尋碼,而是為單個或多個字段建立,且行記錄的某些值可以為null。當我們的where條件不止單個條件的時候我們也會首先通過索引查詢出來一批資料,然後進行順序查詢篩選,所以是完全復合稀疏索引的條件的。

優勢通過上面的了解,稀疏索引占用空間少,但是在查詢的精確率上還是相對於稠密索引還是比較慢的,因為不需要順序查詢,還有回表。

稠密索引那就是相對來說比較快,因為他可以精確定位資料,但是占用的空間比較大。

總結腦圖

資料庫索引的名稱感覺好多呀,各種乙個索引型別感覺有好多名稱,大概通過腦圖描述一下。

了解過後感覺面試官說的也不正確,問mysql為什麼要問稀疏索引??? 我挺疑問的。

參考

資料庫索引之稠密索引和稀疏索引

在了解稠密索引和稀疏索引之前,我們先了解下什麼是聚集索引。所謂聚集索引指的是 在乙個檔案中可以有多個索引,分別基於不同的搜尋碼。搜尋碼 用於在檔案中查詢記錄的屬性或屬性集 如果包含記錄的檔案按照某個指定的順序排序,那麼該搜素碼對應的索引就是聚集索引。稠密索引 上圖所示 在稠密索引中檔案中的每個搜尋碼...

資料庫稠密索引與稀疏索引

一 稠密索引 如果記錄是排好序的,我們就可以在記錄上建立稠密索引,它是這樣一系列儲存塊 塊中只存放記錄的鍵以及指向記錄本身的指標,指標就是乙個指向記錄或儲存塊位址。稠密索引檔案中的索引塊保持鍵的順序與檔案中的排序順序一致。既然我們假定查詢鍵和指標所佔儲存空間遠小於記錄本身,我們就可以認為儲存索引檔案...

Spark稀疏向量和稠密向量

旁邊的小伙一副生無可戀的表情 這是為什麼?我的 和之前寫的一樣,而且都是從官網copy的,結果怎麼是這樣子啊,我只是用向量彙編將多列轉為一列 val va new vectorassembler setinputcols array age sign province code lowest usa...