mysql覆蓋索引理解

2021-08-27 19:18:29 字數 1370 閱讀 1745

覆蓋索引概念:

mysql可以利用索引返回select 列表中的字段。而不必根據索引再次讀取資料檔案。包含所有滿足查詢需要的資料的索引成為覆蓋索引(covering index)。也就是平時所說的不需要回表操作。

判斷標準:

在查詢前面使用explain,可以通過輸出的extra列來判斷,對於乙個索引覆蓋查詢,顯示為

using index,mysql查詢優化器在執行查詢前會決定是否有索引覆蓋查詢。

注意:覆蓋索引也並不適用於任意的索引型別,索引必須儲存列的值。hash 和full-text索引不儲存值,因此mysql只能使用b-tree。並且不同的儲存引擎實現覆蓋索引都是不同的。並不是所有的儲存引擎都支援它們。如果要使用覆蓋索引。一定要注意select 列表值取出需要的列。不可以是select * ,因為如果將所有字段一起做索引會導致索引檔案過大。查詢效能下降。不能為了利用覆蓋索引而這麼做。

innodb中,覆蓋索引查詢時除了除了索引本身的包含的列,還可以使用其預設的

聚集索引列 。

innodb的索引是b+tree資料結構,這個跟myisam也是一樣的,不同的是innodb的primary index葉子節點直接儲存了row記錄資料,而secondary index儲存了pk值。而myisam索引的葉子節點儲存的是記錄的id,即rowid。

下圖是innodb的索引示意圖:

1)如果乙個索引值跟key值不是一一對應的關係,那麼葉子節點儲存的可能是乙個對映位址,指向乙個對應了多個pk值的對映表;

有些資料庫是如此操作的,具體innodb是否如此,我還不太確認;

2)對於組合主鍵,其實就是把多個字段值組合起來作為primary key,結構跟primary key index是一樣的;

3)由於所有非primary key index都引用了primary key所以對primary key的變更會導致所以索引都要重建;

4)innodb預設的pagesize是16k,通過編譯原始碼可以指定為64k,pagesize就是b+tree上乙個節點的容量,pagesize越大key值越小,單個結點能儲存的entry就越多。當索引樹每**出多一層,索引的size也會隨之發生跳躍性的變化。

innodb-file-formats-and-source-code-structure

簡朝陽:myisam 索引結構了解 innodb 索引結構了解

innodb索引初探

如果你對資料庫設計的細節非常的感興趣,我強力建議你可以認真看看這本書《fundamentals of database systems》,

中文譯名是《資料庫系統基礎》,中國電力出版社有出。現在好像已經是第五版了。

mysql索引理解

說到mysql,很多面試官會問mysql的底層儲存結構,mysql的儲存引擎,什麼是聚簇索引之類的問題 我這邊就好好寫寫這些是什麼。首先mysql底層結構是啥,b tree。很多人都會說這個,然後呢這個是怎麼實現的,開始懵逼的,只能記得一些模稜兩可的答案,我這邊其實也差不多,基本屬於模模糊糊,看一遍...

自己對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 倒排索引 將搜尋框中...