簡單點來講,總是開篇簡單講,其實有的面試簡單說一下就夠啦,其實面試官就問你一下了解不了解。
覆蓋索引是指,索引上的資訊足夠滿足查詢請求,不需要再回到主鍵上去取資料。
下面詳細的講一下:
覆蓋索引必須要儲存索引列的值,而雜湊索引、空間索引和全文索引不儲存索引列的值,所以mysql只能用b-tree索引做覆蓋索引。
當發起乙個索引覆蓋查詢時,在explain的extra列可以看到using index的資訊:
覆蓋索引的坑:mysql查詢優化器會在執行查詢前判斷是否有乙個索引能進行覆蓋,假設索引覆蓋了where條件中的字段,但不是整個查詢涉及的字段,mysql5.5和之前的版本也會回表獲取資料行,儘管並不需要這一行且最終會被過濾掉。
如上圖則無法使用覆蓋查詢,原因:
1.沒有任何索引能夠覆蓋這個索引。因為查詢從表中選擇了所有的列,而沒有任何索引覆蓋了所有的列。
2.mysql不能在索引中執行like操作。mysql能在索引中做最左字首匹配的like比較,但是如果是萬用字元開頭的like查詢,儲存引擎就無法做比較匹配。這種情況下mysql只能提取資料行的值而不是索引值來做比較
最後總結一下:
當一條查詢語句符合覆蓋索引條件時,sql只需要通過索引就可以返回查詢所需要的資料,這樣避免了查到索引後再返回表操作,減少i/o提高效率。
使用覆蓋索引innodb比myisam效果更好----innodb使用聚集索引組織資料,如果二級索引中包含查詢所需的資料,就不再需要在聚集索引中查詢了
注:遇到以下情況,執行計畫不會選擇覆蓋查詢
1.select選擇的字段中含有不在索引中的字段 ,即索引沒有覆蓋全部的列。
2.where條件中不能含有對索引進行like的操作。'
哎 也沒辦法,現在市場上各種人才都太多了,只能通過各種原理性問題來篩選大多數的小朋友了,太難了。
奔跑吧,蝸牛~
你了解MySql覆蓋索引嗎?
簡單點來講,總是開篇簡單講,其實有的面試簡單說一下就夠啦,其實面試官就問你一下了解不了解。覆蓋索引是指,索引上的資訊足夠滿足查詢請求,不需要再回到主鍵上去取資料。下面詳細的講一下 覆蓋索引必須要儲存索引列的值,而雜湊索引 空間索引和全文索引不儲存索引列的值,所以mysql只能用b tree索引做覆蓋...
MySQL覆蓋索引呼叫 MySQL 覆蓋索引
什麼是覆蓋索引 建立乙個索引,該索引包含查詢中用到的所有字段,稱為 覆蓋索引 使用覆蓋索引,mysql 只需要通過索引就可以查詢和返回查詢所需要的資料,而不必在使用索引處理資料之後再進行回表操作。覆蓋索引可以一次性完成查詢工作,有效減少io,提高查詢效率。使用示例 查詢語句 select col2,...
MySQL 索引 覆蓋索引
1.什麼是覆蓋索引?概念 查詢語句中所需要的列在索引中,這樣查詢結果在索引的資料結構中查詢即可拿到結果。附加解釋 2.形成覆蓋索引的條件索引分為多種型別,從資料結構上分為 二叉樹 紅黑樹 hash索引 b tree索引,b tree mysql使用的儲存結構 索引的實現可以使用多種資料結構,這裡使用...