簡單點來講,總是開篇簡單講,其實有的面試簡單說一下就夠啦,其實面試官就問你一下了解不了解。
覆蓋索引是指,索引上的資訊足夠滿足查詢請求,不需要再回到主鍵上去取資料。
下面詳細的講一下:
覆蓋索引必須要儲存索引列的值,而雜湊索引、空間索引和全文索引不儲存索引列的值,所以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覆蓋索引嗎?
簡單點來講,總是開篇簡單講,其實有的面試簡單說一下就夠啦,其實面試官就問你一下了解不了解。覆蓋索引是指,索引上的資訊足夠滿足查詢請求,不需要再回到主鍵上去取資料。下面詳細的講一下 覆蓋索引必須要儲存索引列的值,而雜湊索引 空間索引和全文索引不儲存索引列的值,所以mysql只能用b tree索引做覆蓋...
mysql 稀疏 稀疏索引和稠密索引你了解嗎?
背景 最近參加了乙個面試,面試官先問了mysql的資料庫的索引的底層資料介面,我回答了 平時都用的是innodb引擎,所以其底層的索引資料型別是b 樹。面試官問我用沒用過稀疏索引。當時就懵了,聚集索引,非聚集索引,主鍵索引,覆蓋索引等等,我也沒聽過什麼是稀疏索引。我反問了一下 面試官這個索引型別是m...
你真的了解mysql索引嗎?還是太年輕
乙個問題 mysql的innodb引擎下面,索引是個什麼資料結構?答 嚴謹點來說索引資料結構應該是b 樹,mysql的索引是在b樹的基礎上面演變過來的。官網中有原話的哦 故b 樹大概長成這樣 結合b 樹 我們可以來試著解讀最左字首法則 回表 索引下推了 最左字首法則幹嘛的?什麼是回表?除了主鍵索引外...