应该使用 select * 吗?

2020-08-04 11:09:47 +08:00
 lux182

在使用同样索引,同样需要回表查询的情况下,应该使用

  1. select * 还是 2. select 字段,字段,...

我能想到的使用后者的优点可能就是节省那么一点点带宽,

缺点是极大的影响开发效率和维护难度,并且 mapper 文件难看,难懂

8495 次点击
所在节点    程序员
72 条回复
meeop
2020-08-04 11:50:12 +08:00
我的原则是在性能不是问题时注重开发效率,性能有问题在考虑优化
绝大多数场景性能都不是问题,所以放心用 select * 除非是有 orm 帮你生成
baiduyixia
2020-08-04 12:06:08 +08:00
Jackeriss
2020-08-04 12:45:10 +08:00
*能不用就不用,就像 import *一样,谁知道你的*里有什么?
Jooooooooo
2020-08-04 12:57:33 +08:00
如果是真的要捞出全部字段就用

数据库对 * 有专门的优化
vindac
2020-08-04 13:22:30 +08:00
额,我们又上百个字段的表从其中取五六十个,都是 select *
lolizeppelin
2020-08-04 13:39:01 +08:00
不说其他的 一旦你数据库表字段有增加,所有对这个表 select*的代码部分都要改

如果只是写点小东西, 无所谓
lux182
2020-08-04 13:44:56 +08:00
@superrichman 所以啊,你的原因是?
VictorJing94
2020-08-04 13:46:14 +08:00
不应该,虽然我经常用,数据库栏位变动会导致*到的数据不可控
lux182
2020-08-04 13:50:17 +08:00
@lolizeppelin 字段增加,增加 model 字段不就可以吗?
lux182
2020-08-04 13:51:32 +08:00
@VictorJing94 这里可控是为了什么?作为底层 service 在对外暴漏的时候还有一层转换的啊
lolizeppelin
2020-08-04 13:58:32 +08:00
@lux182

新字段不在最后一行的时候,你 model 全乱

遇到需要热更需要先升级数据库,再慢慢升级程序的时候,你 select*咋搞
lolizeppelin
2020-08-04 14:03:18 +08:00
@lux182

如果你只想抬杠,或者就是要说 select*好,那么你赢了

如果不是,我建议你多看看大型项目,好好理解下那些看上去多余的做法
很多做法在小项目里是不需要的,大型项目周期长迭代多,很多看上去东西都是为了解决版本迭代更新兼容

你随手写点东西,压根就不用考虑迭代更新兼容,甚至不用考虑单元测试
自然很多做法就是多余的,禁止 select*就是基础中的基础
wuketidai
2020-08-04 14:05:18 +08:00
显示优于隐式
brader
2020-08-04 14:06:18 +08:00
@lux182 字段增加,增加 model 字段不就可以吗?
我想你对这里有个狭隘的误会,不同语言中,是有不同表现的,对于一些语言,数据库增加字段,是不需要去代码的 model 增加字段的。
admol
2020-08-04 14:14:38 +08:00
想象一个场景, 你有一个接口, 每秒有非常多用户的来请求, 你后面的逻辑涉及到数据库语句写的是 select * ; 平时这可能没有任何问题, 但是有一天产品需求发生变化, 你的数据库需要添加一个字段, 并且这个字段需要返回, 请问你应该怎样来开发这个功能并上线?
先上数据库 DML 语句还是先上你的代码?
如果先上数据库, 你线上代码还是老的, 还没有那个新的字段, 代码全是 select * , 而你与之对应的 model 肯定是没有这个字段, 如何与它映射? 是否会报错? java 的 mybatis 至少会.
如果先上代码, 加入你有 10 台服务器呢, 代码上线, 请求进来之后全是找不到新字段.

如果之前你这个表涉及的 SQL 语句全部都是指定字段 select c1,c2,c3 from table , 那你就可以放心大胆的先让 DBA 给你添加表字段, 然后慢慢上线你的服务, 这部分至少不会有什么问题
hello826
2020-08-04 14:14:54 +08:00
那为啥阿里的 java 开发手册,第五章 Mysql 数据库,第三小节 sql 语句
[强制] 不要使用 count(列名)或 count(常量)来替代 count(*),count(*)是 SQL92 定义的标
准统计行数的语法,跟数据库无关,跟 NULL 和非 NULL 无关。
这个 mysql 实战也是推荐使用 count(*)
hello826
2020-08-04 14:15:18 +08:00
dddd1919
2020-08-04 14:17:14 +08:00
如果需要所有字段,区别不大。
如果只需要部分列的话最好显示声明要返回的字段,省带宽性能更好使用稳定。
显示声明字段还有个好处就是如果字段全部在索引中,可以直接从索引返回结果
wangritian
2020-08-04 14:22:29 +08:00
开发时间特别紧用*,否则好好写
MeteorCat
2020-08-04 14:26:09 +08:00
大表筛选不要用,小表筛选可以用;开发阶段尽量用*,正式验收尽量不要用*;
有时候项目需求文档很多版本,这样加个*直接获取比较方便

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/695458

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX