深入理解mysql索引

2021-10-23 17:11:37 字數 2249 閱讀 5996

三、b+tree

索引是幫助mysql高效獲取資料的排好序資料結構。mysql中索引預設的資料結構為b+tree。

新建兩張表test_innodb(儲存引擎為innodb),test_myisam(儲存引擎為myisam),當進入到mysql安裝目錄下的data資料夾可以看到test_innodb.frm,test_innodb.ibd;test_myisam.frm,test_myisam.myd,test_myisam.myi檔案。

(一)針對myisam有test_myisam.frm,test_myisam.myd,test_myisam.myi三個檔案。

*.frm–表定義,是描述表結構的檔案。

*.myd–"d"資料資訊檔案,是表的資料檔案。

*.myi–"i"索引資訊檔案,是表資料檔案中任何索引的資料樹

(二)針對innodb有test_innodb.frm,test_innodb.ibd兩個檔案。

*.frm–表定義,是描述表結構的檔案。

*.ibd–表資料檔案,其實就是索引和資料儲存在乙個檔案內。

由此可以看出innodb和myisam的索引存的區別,這樣就能更好的理解下午中myisam和innodb索引的區別。

非葉子節點不儲存data,只儲存索引(冗餘),可以放更多的索引。葉子節點包含所有索引字段。葉子節點用指標連線,提高區間訪問的效能(增加範圍查詢的效率)。

系統從磁碟讀取資料到記憶體時是以磁碟塊(block)為基本單位的,位於同乙個磁碟塊中的資料會被一次性讀取出來,而不是需要什麼取什麼。

innodb儲存引擎中有頁(page)的概念,頁是其磁碟管理的最小單位。innodb儲存引擎中預設每個頁的大小為16kb,可通過引數innodb_page_size將頁的大小設定為4k、8k、16k,在mysql中可通過如下命令檢視頁的大小:

show variables like 『innodb_page_size』;

而系統乙個磁碟塊的儲存空間往往沒有這麼大,因此innodb每次申請磁碟空間時都會是若干位址連續磁碟塊來達到頁的大小16kb。innodb在把磁碟資料讀入到磁碟時會以頁為基本單位,在查詢資料時如果乙個頁中的每條資料都能有助於定位資料記錄的位置,這將會減少磁碟i/o次數,提高查詢效率。

b-tree結構的資料可以讓系統高效的找到資料所在的磁碟塊。

由上文提到myisam儲存引擎的資料和索引是分開儲存的,索引中儲存是該記錄在磁碟中所處的位置(這也叫做非聚簇索引:資料和索引分開儲存的);myisam的輔助索引結構與主鍵索引結構類似,索引樹上儲存的為該記錄所在磁碟位置。

(1)主鍵索引(innodb中主鍵索引就是聚簇索引:葉子節點儲存的是索引和資料)

當構建一張儲存引擎為innodb的表時,資料就是以b+tree的樹形結構儲存的(用主鍵構建,當表中沒有主鍵時,mysql會自動從你所有列中選擇一列沒有重複資料的列構建,如過沒有不會重複的列,mysql則會幫你建立乙個隱藏列來維護b+tree。)我們可以看到b+tree的葉子節點儲存的為索引和資料,當查詢資料時只需要掃瞄這顆b+tree就能拿到所有資料。

(二)輔助索引(非主鍵索引)

輔助索引的葉子節點儲存的則是索引和主鍵,很顯然輔助索引會比主鍵索引小,掃瞄會更快。列如上圖中是用name列維護的一顆b+tree,當需要查詢name時可以直接掃瞄這顆b+tree;如果還需要查詢其他列的資訊,則會根據得到的主鍵去主鍵索引中查詢(這就稱為回表操作)。

(3)聯合索引

如圖,以name,age,position三列建立乙個聯合索引,他們是如何排序呢?其實可以看成依次比較,當用name可以比較出大小時直接根據name排序,當name不能比較出大小時則根據age比較,當age不能比較出大小時則根據position比較。

mysql 索引深入理解 深入理解MySql的索引

為什麼索引能提高查詢速度 先從 mysql的基本儲存結構說起 mysql的基本儲存結構是頁 記錄都存在頁裡邊 各個資料頁可以組成乙個雙向鍊錶每個資料頁中的記錄又可以組成乙個單向鍊錶 每個資料頁都會為儲存在它裡邊兒的記錄生成乙個頁目錄,在通過主鍵查詢某條記錄的時候可以在頁目錄中使用二分法快速定位到對應...

深入理解MySQL索引 上

簡單來說,索引的出現就是為了提高資料查詢的效率,就像字典的目錄一樣。如果你想快速找乙個不認識的字,在不借助目錄的情況下,那我估計你的找好長時間。索引其實就相當於目錄。索引的出現是為了提高查詢效率,但是實現索引的而方式有很多種,所以這裡也就引入了索引模型的概念。可以用於提高查詢效率的資料結構有好多種,...

深入理解mysql索引 深入了解mysql索引

1 索引原理 索引被用來快速找出在乙個列上用一特定值的行。沒有索引,mysql不得不首先以第一條記錄開始,然後讀完整個表直到它找出相關的行。表越大,花費時間越多。對於乙個有序字段,可以運用二分查詢 binary search 這就是為什麼效能能得到本質上的提高。myisam和innodb都是用b t...