2011-09-20 124 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意味着只有一行結果,無論有多少行匹配您的查詢。
  • 您不會逃避您的輸入。在這種情況下,如果在之前的代碼中,您已經驗證了這些變量肯定包含整數值,則這可能是正確的。我通常只使用準備好的語句,並完全避免這個問題。