2011-09-20 85 views
0

很简单,这样的查询/语句效率低下还是不好?这是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> 
    <? 
    } ?> 
+0

ISTR有一个codereview网站? –

回答

2

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

+0

so $ strSql =“SELECT clientID,clientName FROM clients WHERE clients.clientID = $ intClientId”; - 这是有效的,而且更有效率? :) – Veritaso0

+0

如果你只需要'clientID'和'clientName',那么是的。但是,你似乎也需要关于项目的信息。 –

+0

是的,就是这样。 – Veritaso0

1

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

+0

我不同意。短标签将完全支持,但默认情况下未启用。 –

+1

如果服务器属于你自己,当然你可以用php.ini做你想做的。但是,有一百万首发开发者拥有共享主机的网站,并且无法更改任何设置。 –

-1

我更喜欢写projects.clientID=clients.clientID,以便更容易地看到表格是如何连接的。

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

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

+0

如果'clientID'上没有'UNIQUE' /'PRIMARY'索引,'LIMIT 1'会保存MySQL的一些工作。 – ceejayoz

+0

即使没有'clientID'上的'UNIQUE'或'PRIMARY'索引,可能有不超过1个客户端使用相同的ID –

+0

当然,但MySQL不知道如果没有进行全表扫描。当第一个(也是唯一的,但MySQL可能不知道)找到一个时,LIMIT 1将截断扫描。 – ceejayoz

0

在编写或者应该说开发新功能时,应该始终在查询上调试和运行性能配置文件,以确保您使用的是正确的索引。在查询中总是使用EXPLAIN(或者说EXPLAIN EXTENDED)来确定其性能。

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

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

2

有几件事情是在这里下车:

  • 正如迈克尔Mior提到,你应该避免SELECT *。这可能是一个效率问题。如果您的应用程序对表中的列进行了假设,然后数据库中的表发生了更改,那么它在某些情况下也可能会中断应用程序。
  • 您的查询中有一个LIMIT 1,但您可以循环查看结果。这是没有意义的,因为LIMIT 1意味着只有一行结果,无论有多少行匹配您的查询。
  • 您不会逃避您的输入。在这种情况下,如果在之前的代码中,您已经验证了这些变量肯定包含整数值,则这可能是正确的。我通常只使用准备好的语句,并完全避免这个问题。