select * 和select 字段的区别与优劣--笔记

文章讨论了在开发中过度使用SELECT*可能导致的效率降低,如无法利用覆盖索引和增加内存消耗。同时,它强调了这种做法对应用程序扩展性的潜在破坏,尤其是在表结构发生变化时。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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操作(添加新列到表中),则返回给应用程序端的查询结果对应的结构也会改变。应用程序应该按照列名进行引用,应该尽量减少受到外部变化的影响。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值