要深刻理解覆蓋索引,要弄清楚innodb引擎b+tree結構,具體結構如下:
那麼這兩個結構的區別在**呢,區別就在葉子節點中,主鍵索引儲存的是整行的資料,而非主鍵索引葉子節點儲存的是主鍵id,可以看下面的sql:
select age from student where name =
'小王';
執行上面的sql流程為:
在name索引樹上找到名稱為小李的節點 id為03
從id索引樹上找到id為03的節點 獲取所有資料
從資料中獲取欄位命為age的值返回 12
上面的操作成為回表:
在流程中從非主鍵索引樹搜尋回到主鍵索引樹搜尋的過程稱為:回表。可以通過覆蓋索引解決。
覆蓋索引(索引覆蓋):
即從非主鍵索引中就能查到的記錄,而不需要查詢主鍵索引中的記錄,避免了回表的產生減少了樹的搜尋次數,顯著提公升效能。
使用覆蓋索引:
把select查詢的值新增上聯合索引就ok了,這樣非主鍵索引的葉子節點中的資料就會滿足查詢條件,而不需要通過主鍵索引再去回表查詢一遍。
如何判斷是否使用的覆蓋索引:
在explain的extra列可以看到using index的資訊,就說明使用到了覆蓋索引。
MySQL索引入門
索引就相當於表的目錄一樣,可以提高我們查詢資料的效率,是一種資料結構。常見的mysql主要有兩種結構 hash索引和b 樹索引。使用哪種資料結構跟儲存引擎有關,innodb引擎預設使用的是b 樹。補充 b 樹索引和雜湊索引的區別?什麼場景不適合使用索引 2 對於那些只有很少資料值的列不適合建立索引 ...
MySQL索引入門
索引於mysql資料庫,就像是目錄於書籍,讀者可以通過目錄可以快速定位到自己想要的內容。同時,索引基本是對mysql進行查詢效能優化最有效的手段。因為mysql的索引是在引擎層而不是伺服器層實現的,所以不同儲存引擎的索引的種類和工作方式是不同的,即便看起來相同,底層實現邏輯也可能大相徑庭。b tre...
mysql索引入門簡介
舉個例子 若將資料庫比作一本書,那麼索引就是書的目錄,用來提高查詢的速度。通過索引,查詢資料時可以不必讀完記錄的所有資訊,而只是查詢索引列。表的不同的儲存引擎定義了每個表的最大索引數和最大索引長度。所有儲存引擎對每個表至少支援16個索引,總索引長度至少為256b,有些儲存引擎支援更多的索引數和更大的...