1)SELECT *,需要数据库先 Query Table Metadata For Columns,一定程度上为数据库增加了负担。但是实际上,两者效率差别不大。
2)考虑到今后的扩展性。因为程序里面你需要使用到的列毕竟是确定的, SELECT * 只是减少了一句 SQL String 的长度,并不能减少其他地方的代码。
在我看来,开发过程中使用select *只是为了贪图一时方便,带来的问题也是不少,通常我们MySQL优化第一件事就是消除select *的用法。
select 带来的问题,我想特别强调二点:
1, 无法合理使用到覆盖索引,导致你的查询极其低效,准确来说它不是一种索引方式,而是一种索引覆盖查询列程度。比如有一个常用查询,只需要用到表中的某两列,user_id和post_id,而且有一个多列索引已经覆盖了这两个列,那么这个索引就是这个查询的覆盖索引了。如果select user_id
,post_id
from xxx 的话,mysql是可以不用读data,直接使用index里面的值就返回结果的。但是一旦用了select,就会有其他列需要读取,这时在读完index以后还需要去读data才会返回结果。这两种处理方式性能差异非常大,特别是返回行数比较多,并且读数据需要IO的时候,可能会有几十上百倍的差异。在EXPLAIN一个语句的时候,有一个信息叫做,Extra,第一种情况,不读data的时候,这个信息是Using index。第二个是Using where。MySQL查询中使用group by/sort by,如果索引设置不当,是会引入using temporary/using file sort/sort buffer/join buffer这些额外内存空间(有时是磁盘空间)来存储。select *查询返回的字段越多,对内存占用也是越多。
2, 对应用程序扩展性的伤害。应用中使用select *进行查询,它间接向代码中引入了一个外部的变化点。如果未来重构表,进行DDL操作(添加新列到表中),则返回给应用程序端的查询结果对应的结构也会改变。应用程序应该按照列名进行引用,应该尽量减少受到外部变化的影响。