可能重复:
Which is faster/best? SELECT * or SELECT column1, colum2, column3, etc.
我目前正在将用MySQL3和PHP4编写的应用程序移植到MySQL5和PHP5。
在分析中,我发现了几个使用“select * from tablename”的SQL查询,即使在PHP中只处理了一个列(字段)。该表有近60列,并且有一个主键。在大多数情况下,唯一使用的列是 id ,这是主键。
如果我使用明确提到列名而不是*的查询,是否会提高性能? (在这个应用程序中,只有一个方法,我们需要所有列,所有其他方法只返回列的子集)
答案 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