mysql索引理解

2021-10-06 13:18:02 字數 1903 閱讀 6008

說到mysql,很多面試官會問mysql的底層儲存結構,mysql的儲存引擎,什麼是聚簇索引之類的問題

,我這邊就好好寫寫這些是什麼。

首先mysql底層結構是啥,b+tree。很多人都會說這個,然後呢這個是怎麼實現的,開始懵逼的,只能記得一些模稜兩可的答案,我這邊其實也差不多,基本屬於模模糊糊,看一遍忘一遍。

我們先來張資料庫表吧,假設表名為t

col1

col2

col3

1一帆風順

2020-02-02

2雙龍戲珠

2020-02-03

3三陽開泰

2020-02-04

4四海昇平

2020-02-05

5五子登科

2020-02-06

6六六大順

2020-02-07

7七步之才

2020-02-08

我們如果要查詢某個資料,比如知道了col1的值,例如6,select* from col1=6,這樣的查詢語句,如果使用的是使用的二叉樹的儲存結構,就會發現如果要去查詢col1為6的資料要走6次才能拿到

這樣是非常浪費時間的,如果是100,1000呢,那查詢的時間會更長

接下來我們可以看btree,相對於普通的二叉樹,b樹真的進化了很多很多,看到這個正宗的b樹了麼,如果現在我們去查詢col1=6的值,我們會發現,我們只要查2次就夠了,先查4,再查6就到了,但是b樹有幾個問題,每個節點都會帶有資料,包含整行資料的值,這就代表每個節點儲存的資料條數不會太多,然後在查詢col1>6的條件的時候就會很蛋疼,他會先查找到6,然後在從頭開始查詢一遍查詢到7,如果還有更多的話,他還要重頭開始查

他每個節點的結構都是如下類似

接下來我們看b+tree,在講之前我們先要講一下樹形結構的葉子和非葉子節點,葉子節點意思是包含這條資料值的節點,非葉子節點則不包含,接下來我們看圖,我們反著看,先看最底下一行,我們發現他1-7的值都包含了,這行就是葉子節點,它裡面包含了所有值,而上面的則沒有值,只是單純的儲存了乙個col1的值,當然我們的col1是主鍵索引,這種b+樹的結構在查詢的效率上是更加快的

在這裡要說一點,如果是查詢3這個值,我們的第乙個查詢應該是,發現要查詢的3,則應該是查3-5這個值,發現3>=3並且小於5,繼續走下一步查詢4這個位置,發現3<4則走4的左邊鏈路,查詢到了3,這個3就包含了這條資料的值,b+tree還有乙個優點就是在查詢非等關係的時候,比如大於,他就可以通過左右鏈路的關係去查,比如》=3,我們就可以先查找到3的位置,然後通過鍊錶關係往後排查,不用再次從頭開始查詢,這個東西b樹就不會有

接下來還有個組合索引的說法,比如我們的組合索引是(col1,col2,col3)這個順序的索引,則樹的結構則會先按照col1的結構來排序,如果相等,則繼續按照col2的順序來排,接著是col3。

在建立mysql資料庫的時候,我們會選擇乙個儲存引擎,很多人認為這個就是所有表的儲存引擎,這個想法是錯誤的,這只是乙個預設的,我們可以單獨為每個表進行儲存引擎的設定,一般我們常用2種

innodb

我們可以看到這個儲存的地方只有2個檔案,他的索引和資料值都是儲存在一起,都在ibd檔案中,可以叫聚簇索引或者聚集索引

myisam

我們看資料庫的儲存,myisam儲存會出現三個檔案,索引和值是分別存在myi和frm兩個表中的,這可以說是非聚簇索引或者非聚集索引

mysql覆蓋索引理解

覆蓋索引概念 mysql可以利用索引返回select 列表中的字段。而不必根據索引再次讀取資料檔案。包含所有滿足查詢需要的資料的索引成為覆蓋索引 covering index 也就是平時所說的不需要回表操作。判斷標準 在查詢前面使用explain,可以通過輸出的extra列來判斷,對於乙個索引覆蓋查...

自己對mysql 索引理解

首先明確幾個觀點 1mysql 是紅黑樹,具體是什麼暫時不去考慮,可以將其當做鍊錶看 只是為了解釋索引,真是情況不可以這樣當 2mysql 資料分塊儲存。可以這樣舉例 mysql 表的結構如下 idusername 實際的儲存方式是這樣的 1,a 2,b 3,a 4,d 5,e 當前我們要查詢id ...

正排索引和倒排索引理解詳解

叮嘟!這裡是小啊嗚的學習課程資料整理。好記性不如爛筆頭,今天也是努力進步的一天。一起加油高階吧!文件 單詞1 單詞2 單詞1 出現的次數 單詞出現的位置 單詞2 單詞2出現的位置 正排索引 在搜尋欄輸入id查詞條 已知id 單詞1 文件1 文件2,文件3 單詞2 文件1,文件2 倒排索引 將搜尋框中...