在SELECT Query中使用*

时间:2010-03-18 10:51:33

标签: php mysql optimization query-optimization

  

可能重复:
  Which is faster/best? SELECT * or SELECT column1, colum2, column3, etc.

我目前正在将用MySQL3和PHP4编写的应用程序移植到MySQL5和PHP5。

在分析中,我发现了几个使用“select * from tablename”的SQL查询,即使在PHP中只处理了一个列(字段)。该表有近60列,并且有一个主键。在大多数情况下,唯一使用的列是 id ,这是主键。

如果我使用明确提到列名而不是*的查询,是否会提高性能? (在这个应用程序中,只有一个方法,我们需要所有列,所有其他方法只返回列的子集)

7 个答案:

答案 0 :(得分:10)

通常认为只提取所需内容是一种好习惯。特别是如果数据库服务器不在同一台机器上,则获取整行将导致查询速度变慢,因为有更多数据要通过网络传输到消费机器。因此,如果一个完整的行就像100k的数据而你只需要更少的ID,那么你当然会得到更快的结果。

作为优化查询的一般提示,请使用EXPLAIN statement查看查询的费用。

答案 1 :(得分:4)

“过早优化是万恶之源”。唐纳德克努特。

永远不要问像Will there be any performance boost?这样的问题。但只问一个问题,比如“我有一定的瓶颈。我该如何消除它?”

在99%的应用程序中,这种“改进”将是不可避免的。许多其他改进,基于梦想,而不是分析和实际需求。

答案 2 :(得分:2)

  

如果有任何性能提升的话   我使用列中的查询   而是明确提到名称   *? -

答案 3 :(得分:1)

是。如果您获取的数据超出了您的需要,则必须从磁盘读取,在MySQL和PHP之间传输,这可能需要更长的时间。

答案 4 :(得分:1)

如果您受益多少取决于具体情况,但至少在您只需要id列的情况下,您应该修复SQL。

除了减少网络流量(发送无用数据)之外,数据库可能只需使用索引就可以访问您需要的几列,而无需访问该表。这样可以加快速度。

唯一可能的缺点是服务器必须处理的不同SQL语句的数量增加(以及更复杂的代码)。

答案 5 :(得分:1)

否 - 会对性能产生影响,但只要架构中没有BLOB / CLOB,它就可以忽略不计(除非您通过300波特调制解调器访问数据库) - 大部分工作由数据库用于标识与WHERE子句匹配的行 - 但是它的(IMHO)编程实践使用SELECT *

下进行。

答案 6 :(得分:1)

是。仅获取所需的列。这不仅可以提高性能,还可以防止代码无意中破坏。请考虑以下问题:

SELECT * FROM tabA JOIN tabB on ... ORDER BY colX

当只有tabA有colX时,它们今天查询工作,但如果你更改模式并将colX添加到tabB,查询将异常终止。

当然,对所有字段使用表别名也有助于防止破坏。

-Krip