你经常可以在网上看到总有一些人会给你说不要使用 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
1.话费没了,流量没了,短信没了,寒假没了,作业还有。 2.别紧张,我又不是什么...
公司网站 域名 空间多少钱?公司搭 建网站 缺少不了域名和空间,具体需要多少钱...
2020年注定是个不平凡的一年,新冠肺炎疫情全球蔓延,对全球经济发展、科技进步...
域名 过期多少天可以注册?域名过期大概60天以后会被注册局删除,删除之后就可以...
文章已收录Github精选,欢迎Star: https://github.com/yehongzhi/learningSumma...
如果当前云服务器系统盘容量不能满足您的存储需要,您可以在购买了云服务器之后...
目标 在仿真理论中,生成随机变量是最重要的构建块之一,而这些随机变量大多是由...
1.现在赶作业是一种时尚,所以我很赶得上潮流。 2.我房间里堆满了情人节卡片,...
A公司在华为云中购买了多种资源,公司中有多个职能团队,这些职能团队需要使用一...
3月8日消息,据外媒报道,物联网研究机构IoTAnalytics称,三分之一的制造商正计...