【SQL面试】为什么不建议用select *

为什么不建议用select *

不要使用SELECT *几乎已经成为了MySQL使用的一条金科玉律,但是到底是为什么呢?

个人感觉直接使用SELECT *还是比较多的,原因有两个:

(1)简单,后期添加或修改字段,SQL语句也不需过多调整

(2)没必要过早对SQL进行优化,遇到问题再调呗

不过还是要明白为什么不建议用select *

不必要的磁盘I/O

MySQL 本质上是将用户记录存储在磁盘上,查询操作就是一种进行磁盘IO的行为。

查询的字段越多,说明要读取的内容也就越多,因此会增大磁盘 IO 开销,尤其是当某些字段是 TEXTMEDIUMTEXT或者BLOB 等类型。

对于无用的大字段,如 varchar、blob、text,会增加 IO 操作,准确来说,长度超过 728 字节 的时候,会先把超出的数据序列化到另外一个地方,因此读取这条记录会增加一次 IO 操作。

增加数据传输时间和网络开销

总结如下「三点」

  • SELECT *数据库需要解析更多的对象、字段、权限、属性等相关内容,在 SQL 语句复杂,硬解析较多的情况下,会对数据库造成沉重的负担。
  • 「增大网络开销;」 * 有时会误带上如 log、IconMD5 之类的无用且大文本字段,数据传输 size 会几何增涨。如果 DB 和应用程序不在同一台机器,这种开销非常明显
  • 即使 MySQL 服务器和客户端是在同一台机器上,使用的协议还是 TCP,通信也是需要额外的时间。

无法使用覆盖索引

SELECT * 杜绝了覆盖索引的可能性,而基于 MySQL 优化器的“覆盖索引”策略又是速度极快,效率极高,业界极为推荐的查询优化方式。

例如,有一个表为 t(a,b,c,d,e,f),其中,a 为主键,b 列有索引。在磁盘上有两棵 B+ 树,即聚集索引和辅助索引(包括单列索引、联合索引),分别保存(a,b,c,d,e,f)和(a,b)。

如果查询条件中 where 条件可通过 b 列的索引过滤一部分记录,查询就会先走辅助索引;如果用户只需要 a 列和 b 列的数据,直接通过辅助索引即可。

如果用户使用 SELECT *,获取了不需要的数据,则首先通过辅助索引过滤数据,然后再通过聚集索引获取所有的列,这就多了一次 B+ 树查询,速度就会慢。

本文由 mdnice 多平台发布

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值