2010-03-18 132 views
5

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

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

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

如果我使用列名被明确提及而不是*的查询,会有任何性能提升吗? (在此应用中,只有一个是我们所需要的所有列法和所有其他方法只返回列的子集)

回答

10

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

作为优化查询的一般技巧,请使用EXPLAIN statement来查看查询的成本如何。

+1

我认为你的回答是迄今为止最好的 – ant 2010-03-18 13:38:06

2

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

1

是的。如果你获取的数据比你需要的要多,那么必须从磁盘读取数据,在MySQL和PHP之间传输等等,这可能需要更长的时间。

+0

'SELECT *'进行了优化,但你只左右获取你所需要的列正确。 – 2010-03-18 10:56:58

1

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

除了减少发送无用数据的网络通信量以外,数据库还可以使用索引访问少数列,而无需访问表。这会加速很多事情。

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

1

否 - 这会影响性能,但只要架构中没有BLOB/CLOB,它就可以忽略不计(除非您通过300波特调制解调器访问数据库) - 大部分工作由该数据库是在确定WHERE子句匹配的行 - 但它的(恕我直言)不好的编程习惯使用SELECT *

C.

4

“过早的优化是所有罪恶根”。唐纳德克努斯。

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

在我们的应用程序的99%,这种‘改进’是irrlelvant。正如许多其他改进的基础上,梦想,而不是在剖析和真实需求。

+1

对不起,但我不能同意。过早优化对于不指定所需字段而言是一个不好的参数。这是懒惰的借口,就是这样。 – 2010-04-08 19:43:12

1

是,只取你需要的列这不仅可以提高性能,但是它会阻止你的代码不小心打破考虑这个查询:

SELECT * FROM 塔巴上JOIN塔布... ORDER BY COLX

当只有tabA有colX时,他们查询作品,但如果更改架构并将colX添加到tabB,则查询将异常终止。

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

-Krip