前言
上篇文章最后面有提到有些状况下,在辅助索引就可以找到所需要的资料,不需要回到丛集索引去,这个概念就跟覆盖索引有关。
覆盖索引 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 栏位,这两个在辅助索引就可以取得了,就不需要回到丛集索引去了。
图1
另外我们也可以透过 EXPLAIN 来发现
在 extra 栏位可以看到显示 Using Index,这个代表了优化器使用了覆盖索引explain select id,name from tel_tb where name = 'Simon'
小结
覆盖索引的好处就是减少 I/O 提升了效能,所以没事不要 select *,不然本来可能有机会使用覆盖索引,变成无法使用了。
资料库知识相当广泛,文中若有不正确的地方,也烦请各位大神不吝指教,谢谢