select * 的八宗罪

select * 的八宗罪

背景(盛传于互联网的说法)

你经常可以在网上看到总有一些人会给你说不要使用select 而是使用具体的列名代替,而且他们也给出了你一部分理由,现在我们也来扒扒这个select 到底为什么不建议用!

第一宗 不必要的IO

  • 这会导致 DBMS 读取所有的数据pages,但是这些数据你又不用,在后来的SQL中又可能被过滤掉了或者是直接没用,但是读取数据是需要成本的,尤其大字段例如 blob ,text 。

    select colunm_a,column_b(select * from XXX) tmp

第二宗 增加了网络负担

  • 读取更多的数据意味着返回更多的数据给客户端,这就是意味着要占用更多的网络带宽

第三宗 占用了更多内存

  • 因为读取了多余的数据,你的程序需要更多的内存去存储这些数据,这意味着你将会使用珍贵的内存资源去存储这些不必要的数据

第四宗 对ResultSet上列顺序的依赖

  • 如果你用了select * 在你的程序中,并且依赖ResultSet(返回结果)的列顺序,那么如果修改了表结构(添加或者删除字段)可能会影响返回结果的列顺序,从而可能导致你的程序数据错误或者程序异常。

第五宗 视图绑定

在数据库设计过程中,我们经常会有这样的情况下

1. 某个基础表会被多个视图或者存储过程引用

2. 修改基础表的时候,我们必须小心翼翼地,因为不会有任何提示告诉我们,如果继续修改,会不

会造成视图或者存储过程有问题

3. 即便我们知道有问题,我们也没有办法去让视图和存储过程刷新得到表最新的信息

  • 如果你在创建视图中使用了select *,就会导致各种各样的bug

第六宗 关联冲突(Conflict in JOIN )

  • 在简单的sql 中可能会表现正常,但是在你多表关联的时候可能会因为重名字段导致sql错误,例如 created,status,updated 等常见字段(一般表都会有)

第七宗 拷贝数据

  • 当你使用 SELECT * into INSERT .. SELECT 做数据拷贝的时候(一种常见的数据拷贝方式),当两张表的字段不一致时,你就可能将错误的数据放入了错误的列。

第八宗 拒绝了使用覆盖索引的可能性

  • 覆盖索引是mysql 中非常重要的是一个优化手段,基本原理就是查询都字段都在索引中避免回表,所以* 会导致覆盖索引失效。

总结

**不使用 select **

主要是是围绕着资源、和程序的稳定性和安全来说。

一 浪费了时间
  • 不论是读取数据还是传输数据,浪费都意味着等待,时间是无价的。
二 浪费了资源
  • 资源这么宝贵,你怎么能这样呢
三 增加了系统出bug 的可能性
  • 程序正确运行数据不对
  • 程序报错
  • 程序运行结果不确定

为什么有人会使用select * 呢

珍惜时间
  • 可以搞定的事情,为啥还要写那个多字段呢,也不美观和直接啊
减少sql 解析器的工作
  • 认为在select 语句中 协商众多的字段,会增减sql 解析的工作,例如是有权限、字段是否存在等等,这个想法是对的,但是这是很早以前的情况,现在*反而会增加sql 解析器的工作。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

不二人生

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值