iT邦幫忙

2

MySQL 系列文 - 索引的相關知識(3) - 覆蓋索引

前言

上篇文章最後面有提到有些狀況下,在輔助索引就可以找到所需要的資料,不需要回到叢集索引去,這個概念就跟覆蓋索引有關。

覆蓋索引 covering index

如同上面提到的,如果使用了覆蓋索引,就表示從輔助索引就可以拿到查詢的資料了,不用回到叢集索引去查詢,好處是輔助索引不是存所有欄位的資料,所以其大小是小於叢集索引的,此外還可以減少 I/O 操作。

★ 範例

這裡用上篇文章的例子來講。
PK: id
index: name
id|name|phone_num
----|-------------
2|Amy|0912345678
5|Simon|0912876543
8|Terry|0912222222
9|Bob|0912111111

假設現在有一個語法 select * from tel_tb where name = 'Simon'
這個語法不會使用到覆蓋索引,因為這裡 select 的是 * ,表示 select id, name, phone_num。這樣表示還是要回到叢集索引裡面去拿到全部的資料

另一個語法 select id,name from tel_tb where name = 'Simon' 這個語法就會使用覆蓋索引,我們可以看一下下面的圖1。
因為 select 只要 id, name 欄位,這兩個在輔助索引就可以取得了,就不需要回到叢集索引去了。
https://ithelp.ithome.com.tw/upload/images/20200304/20124671ZMmFi5kqNB.png
圖1

另外我們也可以透過 EXPLAIN 來發現
在 extra 欄位可以看到顯示 Using Index,這個代表了優化器使用了覆蓋索引
explain select id,name from tel_tb where name = 'Simon'
https://ithelp.ithome.com.tw/upload/images/20200304/20124671rTAljkZ1s0.png

小結

覆蓋索引的好處就是減少 I/O 提升了效能,所以沒事不要 select *,不然本來可能有機會使用覆蓋索引,變成無法使用了。

資料庫知識相當廣泛,文中若有不正確的地方,也煩請各位大神不吝指教,謝謝


圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言