从 MYSQL table 中选择所有字段的性能影响

Performance implication of selecting all fields from MYSQL table

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

我想如果我想使用 49 个字段,那么 select 全部 50 个是有意义的;但可能有一个点(比率?) select 仅输入所需的字段可能更有效。

selecting 所有字段而不是 selecting 仅需要的字段是否对性能有影响?

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

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

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

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

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

而如果您在 SQL 查询中明确命名列,并且您引用的列不再具有该名称,则下次查询 运行。软件设计的一个很好的原则是“Fail Fast”。

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

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