記錄下mysql索引以及回表

2022-08-05 18:39:13 字數 726 閱讀 7717

mysql資料庫的innodb引擎所有的表都預設建立在索引之上的,也就是聚集索引,而主鍵就是聚集索引,所以主鍵只能建一個。普通索引也就是非聚集索引,可以多個。 索引的資料結構是b+樹也就是平衡樹。查詢資料的時候根據索引查詢資料所在位置然後取到資料。查詢普通索引的時候是先根據普通索引找到主鍵再根據主鍵定位到資料,也就是資料是和主鍵一起儲存的。

我們知道計算機磁碟io是非常高昂的操作,所以優化後的磁碟io是有預載入的,也就是讀到哪條資料把附近的資料也一塊讀了,就是page。而b+樹的結構,隨便找了個圖看看。從索引定位資料,最理想的是第一讀載入page時就把索引全拿到記憶體裡了,直接定位到資料這樣就非常快了。然後實際情況不可能如此,但是你也可以想到儘量載入多的索引資料也挺好的,這也是為什麼資料都放到葉子節點,與索引比資料太大了。這是從索引到拿到資料的一個簡單點的描述。那普通索引是怎麼工作的吶?首先查詢方式是一樣的,只不過普通索引找到的葉子有索引欄位和聚集索引,在通過聚集索引找到葉子資料。多了一個過程而已。

回表是什麼?通常資料量大的時候回表是災難性的,比如說人員表裡有學號、姓名、年齡等欄位,學號是主鍵,姓名上也建了普通索引,你如果查詢查詢name欄位,通過name索引就拿到了,而如果在加個age吶?你要在根據主鍵定位資料拿到age欄位資料,這個過程就是回表。這時候就要考慮聯合索引了。索引使用原則什麼的就不說了,簡單寫寫記錄下遇到具體問題順著這個思路查查。

MySQL 的覆蓋索引與回表

如果表設定了主鍵,則主鍵就是聚簇索引 如果表沒有主鍵,則會預設第一個not null,且唯一 unique 的列作為聚簇索引 以上都沒有,則會預設建立一個隱藏的row id作為聚簇索引 innodb的聚簇索引的葉子節點儲存的是行記錄 其實是頁結構,一個頁包含多行資料 ,innodb必須要有至少一個聚...

MySQL慢查詢優化 索引優化 以及表等優化總結

mysql資料庫常見的兩個瓶頸是 cpu和i o的瓶頸。 cpu在飽和的時候一般發生在資料裝入記憶體或從磁碟上讀取資料時候。 磁碟i o瓶頸...