这个mysql语句效率低下吗?

时间:2011-09-20 13:08:25

标签: php mysql

很简单,这样的查询/语句是低效还是坏?

<?

 $strSql="SELECT * FROM clients, projects
           WHERE clients.clientID = $intClientId
           AND projects.clientID=$intClientId LIMIT 1";       

  $objResult=mysql_query($strSql);
  if(mysql_num_rows($objResult)==0) { 
      echo("No data"); }
  while ($arrRow=mysql_fetch_array($objResult))
  {
    ?>
    <h1>Sub Project(s) for: <span><?=$arrRow[clientName]?></span></h1>
    <?
  } ?>

5 个答案:

答案 0 :(得分:2)

一般情况下,除非绝对必要,否则应避免使用SELECT *并仅选择所需的字段。这是否有效取决于表的索引方式。在这种情况下,我假设clientIDclients表的主键。如果clientID表中的projects上有索引,则此查询应该非常快。

答案 1 :(得分:2)

这里有几件事情:

  • 正如Michael Mior所提到的,你应该避免SELECT *。这可能是一个效率问题。在某些情况下,如果您的应用程序对表中的列进行假设,然后表中的表发生更改,它也会破坏应用程序。
  • 您的查询中有LIMIT 1,但随后循环显示结果。这没有意义,因为LIMIT 1意味着您只会获得一行结果,无论您的查询匹配多少行。
  • 你没有逃避你的投入。在这种情况下,如果在早期代码中已经验证这些变量肯定包含整数值,则可能没问题。我通常只使用准备好的语句并完全避免这个问题。

答案 2 :(得分:1)

我还想补充一点建议:从现在开始,尽量不要使用php短标签(使用<?php echo代替<?=)。从PHP6开始,它将不受支持,并且可能在将来为您创建代码错误和其他困难。

答案 3 :(得分:0)

在编写时,或者我应该说开发新功能时,应始终在查询时调试并运行性能配置文件,以确保您使用正确的索引。请始终在查询中使用EXPLAIN(如果您的具体信息,请使用EXPLAIN EXTENDED)来确定其效果。

EXPLAIN SELECT * FROM clients, projects WHERE clients.clientID = 1 AND projects.clientID = 1

我还注意到你做了一个while()循环,如果你只获取一行,这是不必要的。

答案 4 :(得分:-1)

我更喜欢编写projects.clientID=clients.clientID,以便更容易看到表格的连接方式。

我将避免的另一件事(主要是为了清晰)是while循环。由于您需要一条记录,因此无需遍历结果集。

最后,使用短标签不是一个好主意。