SELECT*真的比只选择所需的列需要更多的时间吗?

Ash*_*nho 8 mysql sql performance select

是否会在网站页面加载时产生明显的差异?平均而言,我的表有10列,如果我只需要其中3列,我是否应该在查询中调用它们以使其更快?

Gor*_*off 9

它会产生明显的差异?可能不是在大多数情况下.以下是一些可能会产生重大影响的情况:

  • 7个不需要的列非常非常大.
  • 你要返回很多很多行.
  • 你有一个大表,有很多行,并且3列上有索引,但不是10.

但是,还有其他原因不使用*:

  • 它将在编译查询时根据数据库中列的顺序替换列.如果表的结构发生变化,这可能会导致问题.
  • 如果列名更改或被删除,您的查询将起作用,后续代码可能会中断.如果明确列出列,则查询将中断,使问题更容易发现.
  • 键入三个列名称应该不是什么大问题.明确列出列使代码更具信息性.


Ray*_*Ray 3

是的,如果您只需要少数列,则只需选择这些列。以下是一些原因:

  1. 最明显的是:需要发送回额外的数据,以便传输更大的数据包(或通过本地套接字进行管道传输)。这将增加整体延迟。对于 1 或 2 行来说,这似乎不算多,但是等到您有 100 或 1000 行时...7 个额外的数据列将显着影响整体传输延迟,特别是如果您最终必须破坏结果集分成更多的 TCP 数据包进行传输。如果您使用的是本地主机套接字,那么这可能不是一个问题,但是将数据库移动到网络上的服务器、另一个数据中心等......并且影响将显而易见!
  2. 启用 MySQL 查询缓存后,在结果集中存储不需要的数据将增加您对缓存空间的需求——较大的查询缓存可能会导致性能下降。
  3. 巨大的打击可能是:如果您只需要覆盖索引中的列,那么执行select *覆盖索引将需要对主表中的其余数据字段进行后续点查找,而不仅仅是使用索引表中的数据。