专栏名称: 51CTO技术栈
有趣 | 有料 | 有内涵,为您提供最优质的内容,愿我们一起悦享技术,成就人生。
目录
相关文章推荐
51好读  ›  专栏  ›  51CTO技术栈

CTO说了,谁再用select就开除...

51CTO技术栈  · 公众号  · 程序员  · 2021-03-12 18:05

正文

请到「今天看啥」查看全文


送福利啦

关注 鸿蒙技术社区 ,回复 【鸿蒙】 价值 399元 鸿蒙智能小车 开发套件 (数量有限,先到先得) ,还可以 免费下载 鸿蒙 入门资料

👇 扫码 立刻关注 👇

专注开源技术,共建鸿蒙生态


你经常可以在网上看到总有一些人会给你说不要使用 select,而是使用具体的列名代替,而且他们也给出了一部分理由。


图片来自 Pexels


今天,我们来扒一扒 select * 的八宗罪,到底为什么我不建议你用 select?


第一宗罪:不必要的 IO


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


第二宗罪:增加了网络负担


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


第三宗罪:占用了更多内存


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


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


如果你用了 select * 在你的程序中,并且依赖 ResultSet(返回结果)的列顺序。


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


第五宗罪:视图绑定


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

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

  • 修改基础表的时候,我们必须小心翼翼地,因为不会有任何提示告诉我们,如果继续修改,会不会造成视图或者存储过程有问题。

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


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


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


在简单的 SQL 中可能会表现正常,但是在你多表关联的时候可能会因为重名字段导致 SQL 错误。


例如 created,status,updated 等常见字段(一般表都会有)。


第七宗罪:拷贝数据


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


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


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


总结


不使用 select


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


①浪费了时间


不论是读取数据还是传输数据,浪费都意味着等待,时间是无价的。


②浪费了资源


资源这么宝贵,你怎么能这样呢?


③增加了系统出 Bug 的可能性


例如:

  • 程序正确运行数据不对

  • 程序报错

  • 程序运行结果不确定


为什么有人会使用 select * 呢


①珍惜时间


可以搞定的事情,为啥还要写那个多字段呢,也不美观和直接啊,其实就是懒!


②减少 SQL 解析器的工作


认为在 select 语句中协商众多的字段,会增减 SQL 解析的工作,例如是有权限、字段是否存在等等。


这个想法是对的,但是这是很早以前的情况,现在 * 反而会增加 SQL 解析器的工作。


作者: 刘不二

编辑:陶家龙

出处: juejin.cn/post/6938015423275204644

精彩文章推荐:

为什么大家都说“SELECT *”效率低?
因用了Insert into select语句,同事被开除了!
血一般的教训,请慎用insert into select






请到「今天看啥」查看全文