索引覆蓋與回表

2021-10-24 10:37:02 字數 900 閱讀 4187

懂的越多,不懂的越多

上回書說到:什麼情況下,索引下推沒辦法提高sql查詢效率?

表info

主鍵id

名稱name

值value

別名realname

對於info表,我們現在有(name,value)聯合索引

顯而易見的是,不使用索引下推的話,將導致如果需要查詢realname這一列,那麼我們就需要先根據乙個索引查詢,然後回表一次,然後再根據另乙個索引尋找符合的資料。

解決方案很簡單,索引資料是儲存在索引樹的節點上的,所以是不需要進行回表查詢,那麼兩種解決方案,第一種,不查詢realname不就可以了,第二種把realname新增乙個索引就可以了,這就是索引覆蓋。

索引覆蓋,顧名思義,用索引覆蓋你需要查詢的值。

常用的mysql資料庫的索引使用的是b+樹,建立乙個索引,就是建乙個b+樹,而普通索引和聚簇索引的區別就在於,葉子節點儲存的資料不同,普通索引儲存的是主鍵,而聚簇索引的葉子節點儲存的是行資料,

索引執行順序:先搜尋普通索引樹,找到符合條件的葉子節點(主鍵),然後去聚簇索引拿到對應的行資料。這個也就是回表。

當我們查詢的資料都是索引的話,就可以不用回表去查詢聚簇索引對應的行記錄,這樣就大大提公升了查詢效率。

建立主鍵的時候自動給主鍵新增了索引,且該索引為唯一性索引

這句話經常聽到,可是還是那句老話,不談場景的技術,都是瞎扯,就比如我們建立表結構時,用的不是單一主鍵,而是聯合主鍵,那麼這個時候有幾個索引哪(滑稽保命)?建立的索引是不是聚簇索引哪(滑稽保命)?

學習使我快樂,問題使我進步

mysql覆蓋索引與回表

要說回表查詢,先要從innodb的索引實現說起。innodb有兩大類索引,一類是聚集索引 clustered index 一類是普通索引 secondary index innodb的聚集索引 innodb聚集索引的葉子節點儲存行記錄,因此innodb必須要有且只有乙個聚集索引。1.如果表定義了pk...

回表與覆蓋索引,索引下推

通俗的講就是,如果索引的列在 select 所需獲得的列中 因為在 mysql 中索引是根據索引列的值進行排序的,所以索引節點中存在該列中的部分值 或者根據一次索引查詢就能獲得記錄就不需要回表,如果 select 所需獲得列中有大量的非索引列,索引就需要到表中找到相應的列的資訊,這就叫回表。inno...

Mysql索引 回表 索引覆蓋

1.先說什麼是索引?索引是一種資料結構 不同引擎對索引的實現方式不同,innodb採用b 樹作為索引結構。2.聚簇索引 非聚簇索引索引可分為聚簇索引和非聚簇索引兩種。聚簇索引 clustered index 聚簇索引的資料的物理存放順序與索引順序是一致的。非聚簇索引 二級索引 secondary i...