where
根據id查詢記錄,因為id字段僅建立了主鍵索引,因此此SQL執行可選的索引只有主鍵索引,如果有多個,最終會選一個較優的作為檢索的依據。
-- 增加一個沒有建立索引的字段
alter table innodb1 add sex char(1);
-- 按sex檢索時可選的索引為null
EXPLAIN SELECT * from innodb1 where sex='男';
可以嘗試在一個字段未建立索引時,根據該字段查詢的效率,然后對該字段建立索引(alter table 表名 add index(字段名)),同樣的SQL執行的效率,你會發現查詢效率會有明顯的提升(數據量越大越明顯)。
order by
當我們使用order by將查詢結果按照某個字段排序時,如果該字段沒有建立索引,那么執行計划會將查詢出的所有數據使用外部排序(將數據從硬盤分批讀取到內存使用內部排序,最后合並排序結果),這個操作是很影響性能的,因為需要將查詢涉及到的所有數據從磁盤中讀到內存(如果單條數據過大或者數據量過多都會降低效率),更無論讀到內存之后的排序了。
但是如果我們對該字段建立索引alter table 表名 add index(字段名),那么由於索引本身是有序的,因此直接按照索引的順序和映射關系逐條取出數據即可。而且如果分頁的,那么只用取出索引表某個范圍內的索引對應的數據,而不用像上述那取出所有數據進行排序再返回某個范圍內的數據。(從磁盤取數據是最影響性能的)
join
對join語句匹配關系(on)涉及的字段建立索引能夠提高效率
索引覆蓋
如果要查詢的字段都建立過索引,那么引擎會直接在索引表中查詢而不會訪問原始數據(否則只要有一個字段沒有建立索引就會做全表掃描),這叫索引覆蓋。因此我們需要盡可能的在select后只寫必要的查詢字段,以增加索引覆蓋的幾率。
這里值得注意的是不要想着為每個字段建立索引,因為優先使用索引的優勢就在於其體積小。