<分区>
我在 Linux 网络服务器上使用 PHP 和 MYSQL,并且通常编程为选择匹配的所有记录字段 - 即“SELECT * FROM table1 where field1 like query”。在某些情况下(如生成屏幕索引),我只使用返回记录中的 4 或 5 个字段,这些记录有 50 个字段。
我想如果我想使用 49 个字段,那么选择全部 50 个是有意义的;但可能存在一个点(比率?),其中仅选择所需的字段可能更有效。
选择所有字段而不是仅选择所需字段是否会对性能产生影响?
<分区>
我在 Linux 网络服务器上使用 PHP 和 MYSQL,并且通常编程为选择匹配的所有记录字段 - 即“SELECT * FROM table1 where field1 like query”。在某些情况下(如生成屏幕索引),我只使用返回记录中的 4 或 5 个字段,这些记录有 50 个字段。
我想如果我想使用 49 个字段,那么选择全部 50 个是有意义的;但可能存在一个点(比率?),其中仅选择所需的字段可能更有效。
选择所有字段而不是仅选择所需字段是否会对性能产生影响?
最佳答案
网络速度很快,但并非无限快。通过网络重复传输您不需要的字节会产生性能成本。请记住,在典型的应用程序中,您可能每秒执行多次。
假设您的查询请求 50 列,但您的应用仅使用 49 列。这是 2% 的开销(假设未使用的列的大小恰好是平均值)。如果您可以通过对代码进行一行更改将查询结果集的网络传输开销减少 2%,并且风险很小,您会这样做吗?
如果您只使用 SELECT *
结果中的一半列,差异会变得更加重要。或者,如果您不需要的某些列比平均值大,例如长 BLOB/TEXT 列。
除了运行时性能之外,避免 SELECT *
还有其他好处。
例如,如果有人重命名了您表中的列,但您的代码仍然使用 SELECT *
获取所有列,然后按名称引用结果集中的列,您可能会感到困惑,因为您的应用程序不再显示某些数据,或无法在计算中使用这些数据。这很难调试,或者可能几个月都不会被注意到。
然而,如果您在 SQL 查询中明确命名列,并且您引用的列不再具有该名称,则在下次运行查询时您将收到一条明确的错误消息。一个好的软件设计原则是“Fail Fast”。
快速发现错误并及时修复它们有助于提高另一种性能:开发人员性能。
我在我的书 SQL Antipatterns Volume 1: Avoiding the Pitfalls of Database Programming 的一章中写到了使用 SELECT *
的缺点.
关于php - 从 MYSQL 表中选择所有字段的性能影响,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46937793/