iT邦幫忙

1

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 *,不然本來可能有機會使用覆蓋索引,變成無法使用了。

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


尚未有邦友留言

立即登入留言