【问题标题】:using asterisk in select queries [duplicate]在选择查询中使用星号 [重复]
【发布时间】:2013-03-06 15:03:23
【问题描述】:

我听到很多不要使用 *(星号),而是命名我需要的字段。是因为性能问题还是安全原因?有人可以为此说出一些好的论据吗?

所以没有

SELECT * FROM users WHERE name='John';

而是

SELECT name FROM users WHERE name='John';

【问题讨论】:

  • 这是与 PHP 语言不佳有关的众多迷信之一。大多数时候,这并不重要。
  • @YourCommonSense 这和 PHP 有什么关系?
  • @Your Common Sense: 对不起,你大错特错了。
  • @symcbean 然后向下滚动到best answer
  • @symcbean 确实如此。请阅读所有的答案,而不仅仅是接受的答案。提问者并不总是最了解,接受的答案并不总是最好的答案。

标签: mysql sql postgresql


【解决方案1】:

在生产查询中不使用星号的最大原因是使您的非 SQL 代码免受数据库架构更改的影响,或者使此类更改更难被忽视。

例如,如果您的代码查询带有星号,期望第一列中的 name 和第二列中的 address,如果架构更改为在您已经阅读的两列前面添加第三列,您的代码将获得该新列而不是名称,并且还会用名称代替地址。最糟糕的是,它可以在没有崩溃的情况下完成所有这些操作:用户只会看到垃圾数据。

相比之下,具有显式命名列的查询要么会在架构更改的情况下获得正确的列,要么会在所需列已被删除或重命名时中断。这将立即指出问题的根源,便于您调查和解决问题。

【讨论】:

    【解决方案2】:

    这是一个性能问题。当您SELECT * 时,您正在检索表中的每个 字段。如果您SELECT name,您只选择名称字段。仅选择您需要的字段时,从数据库服务器传输到应用程序的数据可能会少很多。

    【讨论】:

      【解决方案3】:

      SELECT * 表示从您的表中选择全部。它将选择所有列。

      但如果您指定只选择查询中的某些列

      SELECT name ---> 这将只选择 name 列

      【讨论】:

        【解决方案4】:

        因为如果您选择 *,那么您将获得该查询的所有列,这意味着您的数据集的内存使用率更高,而不仅仅是获得您需要的列。

        【讨论】:

          【解决方案5】:

          对我来说,这更像是理智可读性和常识的问题。

          当您只需要 name - 为什么不明确地写出来?
          这将使您的查询为读者提供更多信息。

          但是当我看到糟糕的开发人员明确地写了 几十个 字段名称只是为了遵循这种“性能”废话 - 这让我很受伤。

          来自 cmets 的重要说明:
          编写不依赖于查询中字段的顺序或数量的代码确实很重要。
          因此,只需使用*,获取关联数组,您的代码就不会因为这种愚蠢的原因而中断。

          对于我不起眼的测试,我有一些不同。 0,0002 秒的分数。
          好吧,如果这样的差异是您的应用程序的某个瓶颈 - 去显式写入字段(尽管解析器需要更多时间来解析您的查询,呵呵 :)
          但是,在我的领域中,性能问题从至少 0,001 秒的差异开始。所以,我不会打扰。

          【讨论】:

          • 好吧,没有冒犯的意思,但我认为那些“伤人”的时刻总比在表发生变化时代码中断要好
          • 很抱歉,您的眼睛因阅读代码而融化。这不是答案。
          • 不能更同意@Lamak Select * 用于调查和类似性质的事情。
          • 问题是你似乎认为性能是SELECT * 的唯一问题,而它还有很多其他更重要的问题
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2015-01-30
          • 2016-05-13
          • 2019-11-26
          • 2018-03-07
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多