mysql數據庫的Innodb引擎所有的表都默認建立在索引之上的,也就是聚集索引,而主鍵就是聚集索引,所以主鍵只能建一個。普通索引也就是非聚集索引,可以多個。 索引的數據結構是B+樹也就是平衡樹。查找數據的時候根據索引查找數據所在位置然后取到數據。查找普通索引的時候是先根據普通索引找到主鍵再根據主鍵定位到數據,也就是數據是和主鍵一起存儲的。
我們知道計算機磁盤IO是非常高昂的操作,所以優化后的磁盤IO是有預加載的,也就是讀到哪條數據把附近的數據也一塊讀了,就是page。而B+樹的結構,隨便找了個圖看看。從索引定位數據,最理想的是第一讀加載page時就把索引全拿到內存里了,直接定位到數據這樣就非常快了。然后實際情況不可能如此,但是你也可以想到盡量加載多的索引數據也挺好的,這也是為什么數據都放到葉子節點,與索引比數據太大了。這是從索引到拿到數據的一個簡單點的描述。那普通索引是怎么工作的吶?首先查找方式是一樣的,只不過普通索引找到的葉子有索引字段和聚集索引,在通過聚集索引找到葉子數據。多了一個過程而已。


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