回表和覆蓋索引

什麼是回表,舉個例子,建一張表order。
表字段有id,mcode,code,detail;id爲主鍵,mcode字段加索引
現在根據mcode查詢所有的code(根據主單編號,查詢所有的子單編號)
語句:select code from order where mcode = ‘M001’;
這時候數據庫會怎麼操作呢?
因爲mcode索引,所以查詢mcode的索引,查到符合要求的數據的rowid(索引內是不會保存具體數據的),再根據rowid,查詢到具體的數據,拿到code。
這就是回表,簡單來說就是:數據庫根據索引找到了指定的記錄所在行後,還需要根據rowid再次到數據塊裏取數據的操作

如何避免回表呢,這就用到覆蓋索引,但是我覺得叫索引覆蓋更合適
不使用mcode的索引,使用(mcode,code)的聯合索引。
在查找到mcode的索引後,可以直接拿到code了,不需要再回表。
個人覺得叫索引覆蓋是,利用聯合索引避免了回表,只是把要查的數據覆蓋了而已。

當然,覆蓋索引肯定有侷限性,查的字段較少。比較有特殊性。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章