【问题标题】:Performance implication of selecting all fields from MYSQL table [duplicate]从 MYSQL 表中选择所有字段的性能影响 [重复]
【发布时间】:2017-10-25 16:39:27
【问题描述】:

我在 Linux 网络服务器上使用 PHP 和 MYSQL,并且通常编程选择所有匹配的记录字段 - 即“SELECT * FROM table1 where field1 like query”。在某些情况下(如生成屏幕索引),我只使用返回记录中的 4 或 5 个字段,这些记录有 50 个字段。

我想如果我想使用 49 个字段,那么选择所有 50 个字段是有意义的;但可能有一点(比率?),只选择所需的字段可能更有效。

选择所有字段而不是只选择所需字段是否会影响性能?

【问题讨论】:

  • 谢谢,是的,看起来已经回答了。
  • FWIW - 我怀疑性能影响是可衡量的 - 如果您的 I/O 如此短缺,那么您的整个架构就会陷入困境。

标签: php mysql select field


【解决方案1】:

网络速度很快,但并不是无限快。通过网络重复传输不需要的字节会产生性能成本。请记住,您可能在典型应用程序中每秒执行多次

假设您的查询请求 50 列,但您的应用只使用 49 列。这是 2% 的开销(假设未使用的列的大小正好是平均大小)。如果您可以通过对您的代码进行一行更改,将查询结果集的网络传输开销降低 2%,并且风险很小,您会这样做吗?

如果您只使用 SELECT * 结果中的一半列,则差异会变得更加重要。或者,如果您不需要的某些列大于平均值,例如长 BLOB/TEXT 列。

除了运行时性能之外,避免SELECT * 还有其他好处。

例如,如果有人重命名了您表中的列,但您的代码仍然获取所有带有 SELECT * 的列,然后按名称引用结果集中的列,您可能会感到困惑,您的应用程序不再显示某些数据,或未能在计算中使用数据。这很难调试,或者可能几个月都不会被注意到。

如果您在 SQL 查询中明确命名列,并且引用不再具有该名称的列,那么您将在下次运行查询时收到明确的错误消息。一个好的软件设计原则是“Fail Fast”。

快速发现错误并及时修复有助于提高另一种性能:开发人员性能。

我在我的书SQL Antipatterns: Avoiding the Pitfalls of Database Programming 的一章中写到了使用SELECT * 的缺点。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-12-24
    • 2015-07-25
    • 1970-01-01
    • 2011-06-07
    • 2015-10-21
    • 1970-01-01
    • 2022-11-27
    • 1970-01-01
    相关资源
    最近更新 更多