当前位置: 首页 > 科技观察

CTO说,谁再用select,谁就被开除,

时间:2023-03-12 17:54:37 科技观察

网上经常看到有人告诉你不要用select,要用具体的列名,而且他们还给出部分原因。图片来自PexelsToday,一起来看看select*的八宗罪。为什么我不推荐你使用select?第一个罪过:不必要的IO会导致DBMS读取所有的数据页,但是这些数据你不需要,在后面的SQL中可能会被过滤掉或者无用,但是读取数据是需要成本的,尤其是大字段,比如blob和文字。selectcolumn_a,column_b(select*fromXXX)tmp第二宗罪:增加网络负载读取更多的数据意味着返回更多的数据给客户端,也就意味着占用更多的网络带宽。第三宗罪:占用更多内存因为你读取了冗余数据,你的程序需要更多的内存来存储这些数据,这意味着你将使用宝贵的内存资源来存储这些不需要的数据。第四宗罪:依赖于列在ResultSet上的顺序如果你在程序中使用select*并且依赖于列在ResultSet上的顺序(返回结果)。那么如果修改表结构(增加或删除字段)可能会影响返回结果的列顺序,这可能会导致你的程序数据错误或程序异常。第五宗罪:视图绑定在数据库设计过程中,我们经常会遇到这样的情况:某个基础表会被多个视图或存储过程引用。在修改底层表的时候一定要小心,因为不会有任何提示告诉我们继续修改会不会导致视图或存储过程出现问题。即使我们知道有问题,我们也没有办法通过刷新视图和存储过程来获取表的最新信息。如果在createview中使用select*,会导致各种bug。第六宗罪:JOIN冲突在简单的SQL中可能表现正常,但是当你关联多个表时,可能会因为同名字段而导致SQL错误。比如created、status、updated等常用字段(一般表都会有)。第七宗罪:复制数据当你使用SELECT*intoINSERT..SELECT复制数据(一种常见的数据复制方法)时,当两个表的字段不一致时,你可能会将错误的数据放入错误的列中。第八宗罪:拒绝使用覆盖索引的可能性。覆盖索引是MySQL中一个非常重要的优化方法。基本原则是查询中的所有字段都在索引中,避免返回表,所以*会导致覆盖索引失效。总结一下,不用select主要是资源和程序的稳定性和安全性。①浪费时间无论是读取数据还是传输数据,浪费都意味着等待,而时间是无价的。②浪费资源资源那么宝贵,怎么能这样呢?③增加系统出现bug的可能性例如:程序运行正确,数据不正确,程序报错,程序运行结果不确定。为什么有人会使用select*?①可以按时完成。东西啊,为什么非得写那个多字段呢?不算漂亮直接,但是很懒!②减少SQL解析器的工作。认为select语句中协商很多字段会增加或减少sql解析的工作,例如haspermissions,字段是否存在等,思路是对的,但是很久以前就是这样,现在*反而会增加SQL解析器的工作量。作者:刘不二编辑:陶家龙来源:juejin.cn/post/6938015423275204644