mysql 資料結構 Mysql索引資料結構

2021-10-25 14:16:38 字數 2081 閱讀 7486

mysql索引資料結構

當慢查詢時,看sql是否走索引。

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

mysql若不建立索引,查詢某條資料時則會逐行掃瞄,每掃瞄一行資料就會做一次磁碟io。

b-tree:

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

所有索引元素不重複。

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

b樹模型圖。在b樹中,無論中間節點還是葉子節點都帶有資料。

b+樹模型圖,只有葉子節點帶有資料,其餘中間節點僅僅是索引,沒有任何資料關聯。

b樹與b+樹的效能比較

查詢過程看上去跟b樹差不多,但還是有兩點不同的,首先,b+樹中間節點沒有資料,只存索引資料,所以同樣大小的磁碟頁可以容納更多的節點元素,這就意味著,資料量相同的情況下b+樹比b樹更加的」矮胖「,相應會減小io次數。其次,b+樹的查詢必須最終查詢到葉子節點,而b樹只要找到匹配元素即可,無論匹配元素處於中間節點還是葉子節點。

因此,b樹的查詢效能並不穩定,最好的情況是只查根節點即可,最壞的情況是要查到葉子節點,而b+樹每一次查詢都是穩定的。

b+樹比b樹的優勢有三個:

1、單一節點儲存更多的元素,使得查詢的io次數減少;

2、所有查詢都要查詢到葉子節點,查詢效能穩定;

3、所有葉子節點形成有序鍊錶,便於範圍查詢。

為什麼mysql索引要用b+樹不是b樹?

用b+樹不用b樹考慮的是io對效能的影響,b樹的每個節點都儲存資料,而b+樹只有葉子節點才儲存資料,所以查詢相同資料量的情況下,b樹的高度更高,io更頻繁。資料庫索引是儲存在磁碟上的,當資料量大時,就不能把整個索引全部載入到記憶體了,只能逐一載入每乙個磁碟頁(對應索引樹的節點)。其中在mysql底層對b+樹進行進一步優化:在葉子節點中是雙向鍊錶,且在鍊錶的頭結點和尾節點也是迴圈指向的。

提問:為何不採用hash方式?

等值查詢時可以,但無法滿足範圍查詢

mysql的myisam、innodb引擎

儲存引擎是修飾表的。(資料庫檔案是儲存在磁碟的mysql安裝目錄的data資料夾下)

myisam引擎(非聚集)的資料庫表對應3個檔案:

frm:儲存表的結構定義檔案

myd:儲存表內的資料行(儲存了表的真實資料)

myi:儲存了表內的索引字段(即那棵b+樹)

b+樹的葉節點的data區域內儲存的是myd表內資料的行位址(即指標)

innodb引擎(聚集)

資料庫表對應2個檔案:

frm:儲存表的結構定義檔案

ibd:儲存的是表的索引+資料(即myisam的myd+myi的合併)

b+樹的葉節點的data區域內儲存的是一整行資料

mysql中普遍使用b+tree做索引,但在實現上又根據聚簇索引和非聚簇索引而不同。

聚簇索引

所謂聚簇索引,就是指主索引檔案和資料檔案為同一份檔案,聚簇索引主要用在innodb儲存引擎中。在該索引實現方式中b+tree的葉子節點上的data就是資料本身,key為主鍵,如果是一般索引的話,data便會指向對應的主索引。

在b+tree的每個葉子節點增加乙個指向相鄰葉子節點的指標,就形成了帶有順序訪問指標的b+tree。做這個優化的目的是為了提高區間訪問的效能,如果要查詢key為從18到49的所有資料記錄,當找到18後,只需順著節點和指標順序遍歷就可以一次性訪問到所有資料節點,極大提到了區間查詢效率。

非聚簇索

非聚簇索引就是指b+tree的葉子節點上的data,並不是資料本身,而是資料存放的位址。主索引和輔助索引沒啥區別,只是主索引中的key一定得是唯一的。主要用在myisam儲存引擎中。

為何innodb表必須有主鍵,並且推薦使用整型自增主鍵?

採用整型是因為在主鍵比較時更容易,比uuid更快速,自增是因為當插入新節點時,自動在葉節點處往後補充即可,若不是自增,b+樹為保證節點的大小順序,可能會產生節點的**和平衡的調整,十分耗時。

innodb的非主鍵索引

在葉節點處的data區域儲存的並不是整條資料,而是整條資料的主鍵。(為保證資料的一致性和節省儲存空間)

mysql之聯合索引

索引最左字首原理

聯合索引因為每個節點記憶體有多個字段,因此為保證資料從左到右依次遞增,就將(假設)3個字段依次進行大小比較。

mysql資料結構

在剛才新建表的過程中,我們提到了資料型別,mysql 的資料型別和其他程式語言大同小異,下表是一些 mysql 常用資料型別 整數型 整數除了 int 外,還有 tinyint smallint mediumint bigint。字元型 char 和 varchar 的區別 char 的長度是固定的...

MySQL三維資料結構 MySQL資料結構

索引 索引是對資料庫表中一列或多列的值進行排序的一種結構,使用索引可快速訪問資料庫表中的特定資訊。是一種單獨的 物理的對資料庫表中一列或多列的值進行排序的一種儲存結構,它是某個表中一列或若干列值的集合和相應的指向表中物理標識這些值的資料頁的邏輯指標清單。mysql索引的資料結構是b 樹,mongod...

mysql 頁 MySQL資料結構 頁結構

innodb設計了多種頁結構用於存放不同型別的資料,我們現在主要研究存放資料的頁,稱為索引頁或資料頁。每個頁由七部分組成,大致功能如下 fileheader 檔案頭 記錄頁的通用資訊,比如上下頁的頁號,頁型別,所有的資料頁其實是乙個雙鏈表 pageheader 頁頭 記錄本頁儲存記錄的狀態資訊,比如...