相信在sql优化中,会提到尽量避免使用select * ,那这又是为什么呢?

接着使用表testtable,有a,b,c,d四个字段,b为varchar,其余为int。

索引abc:(a,b,c)有三个字段。

来对比一下两句不同sql的运行情况。

explain SELECT a,b,c from testtable where a=1 and b=‘2’ and c=3;

abab

explain SELECT * from testtable where a=1 and b=‘2’ and c=3;

abcde

我们可以看到两者都用了索引,但是区别在于,extra字段abc提示了‘Using index’,而*没有任何提示。

这说明了什么呢?

Using index代表了mysql直接从索引中就取得了数据,没有再次查询数据表。

的确从第一条sql结合B+Tree结构分析在建立索引时,abc的数据都已经存入了B+Tree的叶子节点,所以mysql在查询时只需要遍历索引就可以获得相应的结果。

然而一旦加入了d字段,因为d字段没有建立索引,因此在通过索引定位后,还需要进入数据表查询对应的d字段。

二者相比,*多了一步。

目前看来只是一个字段的差异,但是现实业务中,数据表的字段要远远多于现在。

所以如果仅需要对索引字段查询,那么应该尽量避免使用select *。

这就是所谓的覆盖索引。

那么如果这张表只有三个字段,而且全部加上了索引,结果又会如何?

我们删除d字段,运行上述两句sql。

explain SELECT a,b,c from testtable where a=1 and b=‘2’ and c=3;

explain SELECT * from testtable where a=1 and b=‘2’ and c=3;

111123

得到的结果一模一样。

也就是说,mysql会根据我们的索引情况,自动判断所包含的字段。这里由于二者重合,才导致也使用了索引。

但仍然不推荐使用*,毕竟恰好重合的情况比较少。