p3c select * 应该是普遍情况下的用法,只有性能优化场景,才是只查询需要的字段

jtjikinw  于 2022-10-25  发布在  其他
关注(0)|答案(3)|浏览(142)

规约原文

【强制】在表查询中,一律不要使用 * 作为查询的字段列表,需要哪些字段必须明确写明。
说明:1)增加查询分析器解析成本。2)增减字段容易与resultMap配置不一致。

问题描述

我认为这条规约不合理。

  1. 查询分析器指的是explain嘛?如果是expalin,这个只在查询sql执行计划时会用到,不是我们正常开发会用到的操作,不应该作为禁止的理由。
  2. 正常操作中,不太应该有减字段这个操作,这是很危险的,危险操作应该禁止,而不是作为规范设定的理由。
  3. resultMap配置,现在mybatis之类的组件都可以和数据库model的字段自动匹配Map上,不太需要自己去手写的,所以这个作为理由感觉不充分。

修改建议

我认为在普遍情况下,出于开发、复用的成本考虑,都应当是默认查询所有数据库表字段。
只有在涉及性能优化时,根据where条件加索引还无法满足需求时,才进一步考虑写明字段,以减少io和覆盖索引。
出于方便的考虑,使用 * 作为查询字段列表,是合理且高效的。

t2a7ltrp

t2a7ltrp1#

查询解析器指的是这个

bfhwhh0e

bfhwhh0e2#

  • 为啥会导致查询解析器有一个需要关注的解析成本?

ps:

  1. 不要说 * 会解析全字段,手册说的是写清楚要查的字段,而不是不要查询不必要的字段。我既然用*,就要要查询全字段,所以这个问题也可以简化成:使用 * 查询全字段,与在sql把全字段写出来,多出来的成本?
  2. "需要关注的成本",任何操作都是有成本的,但是不是所有成本都需要我们关注。
bejyjqdl

bejyjqdl3#

  • 为啥会导致查询解析器有一个需要关注的解析成本?

ps:

  1. 不要说 * 会解析全字段,手册说的是写清楚要查的字段,而不是不要查询不必要的字段。我既然用*,就要要查询全字段,所以这个问题也可以简化成:使用 * 查询全字段,与在sql把全字段写出来,多出来的成本?
  2. "需要关注的成本",任何操作都是有成本的,但是不是所有成本都需要我们关注。

是的,首先第一点我觉得你说的没错,既然你已选择查询所有的字段,那就没有必要把所有的字段写出来,直接用*代替会清晰明了很多,其次第二点我觉得也没问题,查询解析器的成本确实很低,可以忽略不计了,不然也不会有这个语法的出现,可能是对于这方面过于苛刻过于精益求精了。但是我想说的是,阿里规约是阿里规约,并不是每个人都要遵守,这个东西本来就是仁者见仁智者见智的事情,就好像写代码时有人觉得花括号需要另起一行,有的人觉得写在行尾好一点一样。这只不过是统一标准统一口径罢了,没必要过度深究,毕竟一千个读者就会有一千个哈姆雷特,如果是个人项目的开发,自己写的开心就好了,如果是团队开发,那总要有一个人制定标准,其他人遵守标准,仅此而已。

相关问题