面试官:为啥不建议使用select *我差点被恶心到了。。。

作者: 图灵诸葛讲Java分类: 计算机技术 发布时间: 2023-09-19 16:33:29 浏览:70475 次

面试官:为啥不建议使用select *我差点被恶心到了。。。

芊姐和团弟:
速度只是一个方面,如果习惯了使用select * from的方式,有的时候因为业务需要,会写很多类似于insert into t1 select x,y,z这种,如果都用select * from去写,在因为业务需求扩了某个表的字段后,很多地方都会报错。实际也是一种业务接耦合的需要。

【回复】这个是主要原因吧,频繁迭代的项目动不动在某处多给一个字段,联调起来怕是要崩溃
【回复】回复 @清溪川 :回复 @清溪川 :主要是踩过坑,接手的项目,给表加了字段,其他地方到处报错。[笑哭]后面我自己写也都不用*号了,怕被人骂。
【回复】正解,生产环境中速度其实优先级并不高
喝一口烫烫烫的锟斤铐:
越大的公司,越老的程序员,就越喜欢拿他的经验说事,我也遇到过

【回复】对对对,踩坑的经验不信,非要自己搞[吃瓜]
【回复】回复 @喝一口烫烫烫的锟斤铐 :分表和拆表的颗粒度是由业务决定的[吃瓜]这个没法评价。
【回复】回复 @TK-Xiong :为了代码美学,一定要分表然后join查询,问就说他经验比我多,这种领导你遇到过吗?
weeljty:
大规模数据库的确应该避免使用select *,因为一个超级宽表可能有几千上万列[doge]

月半晓风:
很多时候select*是存在必要的,别无脑下结论。在列式存储db里,或者宽表里可能select*存在性能问题,但是那个只是特殊情况,别发一些无脑经验误导别人,动不动就下结论。这里尤其指一些什么“阿里经验”,“java架构师说”,无脑的很。至于写select*导致报错,那也只是在复杂sql里,实际业务上裸写sql是很少的,也不推荐在代码里写sql

【回复】数据库加个字段能系统崩溃的你们别做系统了,中间层没有的吗?前端直连数据库?
【回复】回复 @491463646 :想反驳就动动脑子想一下原理,别无脑喷。
【回复】这个视频完全在误导人,速度对比的方式本来就是错误的。之所以用 * 是因为需要所有字段,不推荐是因为后来维护起来不直观,还要拉表字段自己看,尤其是在复杂sql下(如果你要在几千行的sql中使用* 你可能真的会被打死)
冰块柠檬:
不用*主要还是为了可读和维护,对主库来说不允许多表链接的复杂查询来说,是否用*来查询可读性还好。但是做数据清洗时,一个庞大且复杂的SQL,一个*可能会使得一个小问题解决起来会复杂许多倍。

【回复】而且工作中许多时候就只在一张大表中,捞出一两个主业务字段。 再从另一个方面来说,如果上线时粗心导致新增字段的脚本漏掉了。在框架处理映射时。*会导致项目在启动运行时报错,按需查询不会。
【回复】回复 @薛定谔の绘梨衣 :mybatisplus+Druid,单数据源遇到过。动态多数据源的时候倒不会报错
【回复】回复 @冰块柠檬 : 是什么框架有这个问题?
伊利萨:
跟面试官说,我们是不允许代码中出现显示使用sql的

【回复】回复 @橘枳橼_沃柑_ :哪个orm是select *让我见识见识,我去试试给他少定义一个字段会怎么样。
【回复】DSL本质一样,ORM实际上全都是select *,难道你这是 all in NoSQL了吗?
【回复】回复 @伊利萨 : 不是说这个,不允许直接使用 SQL 不代表不会遇到同样的问题(尽管在真的遇到它变成一个问题之前不应当把它当一个问题),你这样的回应其实有点红鲱鱼了(指通过引入另一个不相干议题来转移对于原本议题的注意力)。 在期望视频中以运行效率的议题下,可以把问题转换成:为什么 ORM 运行效率低?(假定它影响到用户体验了)有什么解决方法?
胖丶KK:
我接手的那个项目就是全是select *,insert into,本来还能正常用,结果有个客户定制了一个外置插件,导致好多表增加字段,然后程序全部GG。。改了一个多周。。。

【回复】那我虚心求教一下,查询采用列出需要的字段后,其他程序需要增加新的字段后,本程序需要如何修改? 且不说我之前提的是因为外置插件导致的问题。哪怕就是标准程序。多个地方去引用一个表。某一个程序要增加一个字段。我如果select列出需要的字段,是不是只改一个子程序就行?其他的程序不需要动。
【回复】回复 @红发的shanks :顺便告诉你哦,因为工作的时候懒得动脑子,反正写select +想要的字段绝对不会出错,哪个人闲得无聊放着100%不出错的代码不写,要去思考能不能用select *?其次select *底层运行的时候也会给你把字段带上去,你不会以为少写一点字段可以加快你的代码运行速度吧?最后像你这样的业余开发真的是太典了,工作满一年了吗?这么装?[呲牙]
【回复】回复 @红发的shanks :1. 持久层框架底层到底是怎么处理sql中多出来的字段这个你是不要想当然的,有些持久层框架对于从数据库查询多出来的字段都是统一报错,有些持久层只会映射正确的字段到对应的实体对象中。 2.不管你问再多,抬再多杠,企业级开发都是不允许使用select *的。 3. 人家啊对对对就是单纯的懒得理你,因为知道你的水平太低了所以懒得和你废话。
呼噜咕噜咕噜:
2B业务复杂用户少,起步阶段变动还特别频繁,用select *会提高冗余度。阿里的这些要求2C业务更适合些。开发没有银弹,具体问题具体分析更好

【回复】回复 @星期3_ : 书出了二十年……我们还是在柏油坑里面……
【回复】回复 @SYMagic鬼王归来 : 有书
【回复】开发没有银弹怎么听着这么耳熟[吃瓜]
qkiori_520:
作为DBA,要用select *,那你这个版本就别上线了。改完再上。改到半夜我陪你到半夜[doge]

【回复】现在MySQL版本已经优化过select *了啊。和你select把字段全加上没任何区别[笑哭]
【回复】[藏狐]就用就用,用了先上线,dba发现再改
【回复】回复 @艹中国人不骗中国人 :表是会变化的啊,你这个版本用*,下个版本增加字段了或者减少字段了,其他接口就会不匹配了。
三十九岁退休:
人分两种,一种奉献自我,一种贪婪无度。 奉献自我的人以满足普罗大众为己任, 贪婪无度的人,限制别人,放纵自己。 有奉献自我的人的地方,会有勃勃生机,突破一个又一个不可能。 有贪婪无度的人的地方,先坐吃山空,后家徒四壁。

【回复】回复 @之风少年 :东北直接禁止用select,
【回复】回复 @三十九岁退休 :你说的不就是东北的写照吗[滑稽]
当天边的微风轻轻吹起:
你需求不再改来改去了那当然可以不用*,你特么一天改八遍需求还让人这个那个的,得加钱

【回复】[doge]用*你不怕代码评审的时候被批斗啊
瞎子最无敌:
因为会回表,第二是因为增加底层编辑器的负担,你写型号,底层编辑器还是要帮你把所有字段全写上去

【回复】就那点鸟性能,还不如好好检查一下SQL有没有用上索引
【回复】回复 @蹭亮的小灯泡 :你说的都对[doge],面试的时候你也这么说:就你这鸟水平还来面我?
【回复】回复 @百合百景 :补充一下,不只有这一种情况会回表,还有其他情况,就不细说了
追忆D逝水年华:
任何干过正规企业级的程序员都会知道,确实不能这不写,你每写个照会查询sql都需要压力监视还有审查科过审的[doge]

【回复】回复 @风之子QAQ1020 :凭啥不干加大字段的那个人。把所有会让select * 出问题的人都干掉,就能放心用select *了
【回复】code rivew直接人没了,出问题别人还去定位你的烂代码,碰到大字段,网络io直接把自己干死,绩效直接c。
愚智难言:
屎山代码就是一群不知轻重自以为是的年轻程序员造出来的

guu0824:
其实视频里是全字段和部分字段的区别,不是* 和全字段的区别。 部分字段肯定是列举字段啊,但是解释一定不允许*这个观点,难道重点不是全字段和*的区别? 把id 和remarks 带上再去解释,才是真正合理的解释

Jenercy:
如果我同时需要查 remarks 字段,select all 和 select *没区别的

【回复】对,如果你需要全取出来,直接用*没区别
Leon7808:
用*能报错的代码,是使用数据的代码问题,非数据库性能问题,除了超大超宽表查询不能用*,一般表查询是没问题的,除非你们公司没有中间层或中间层非常火立。

科技猎手 程序员 编程 select * 面试 java 编程开发 select Java面试 SQL优化

如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!