2011-09-01 97 views
-1

有了這個,我檢查是否已經有一個用相同登錄名註冊的會員。我擔心的是,如果數據庫數量增加到數以千計的成員,我應該編輯這個不知何故?這個mySQL查詢可以更快嗎?

$qry = "SELECT * FROM registered WHERE login='$login'"; 
    $result = mysql_query($qry); 
    if($result) { 
     if(mysql_num_rows($result) > 0) { 
      $errmsg_arr[] = 'Login ID already in use'; 
      $errflag = true; 
     } 
     @mysql_free_result($result); 
    } 
    else { 
     die("Query failed"); 
    } 
+0

注意,成員的「千」是不是有很多的數據庫。 – Vache

回答

0
$qry = "SELECT COUNT(*) as cnt FROM registered WHERE login='$login'"; 
$result = mysql_fetch_assoc(mysql_query($qry)); 
if($result['cnt']) { 
    $errmsg_arr[] = 'Login ID already in use'; 
    $errflag = true; 
} 
else { 
    die("Query failed"); 
} 
+0

爲什麼這更快? – servitora

+0

@servitora:因爲它的選擇只能算,而不是數據 – genesis

3

只是限制你拉列數。而不是SELECT *,只是SELECT login或類似的東西。只要login被索引,查詢本身不會很慢。

$qry = "SELECT login FROM registered WHERE login='$login'"; 

數以千計的行應該對RDBMS完全沒有問題。它們被設計爲可以處理數百萬個,但是您可以通過不選擇所有列來節省一小部分內存。

+0

只是出於好奇,但將'LIMIT 1'有所作爲? – Kevin

+0

這會比'count(*)'快嗎? – servitora

+0

@Kevin我不認爲限制1會有所作爲,因爲它會影響到哪些行被提取。實際上沒有行在這裏被提取,我們只需檢查rowcount。 –

3

一些事情。

  • 您應該在您的where條件中嘗試使用的行放置索引。
  • 你是否已經完成escapting?如果不是,你的查詢很容易被注入。
  • 即使沒有建立索引,1000行也不算什麼。
0

我覺得這不會有任何「更快」,但是如果行存在與任何其他字段的長度相比,您只返回單個字符回到查詢。

SELECT 1 FROM registered WHERE login='$login' LIMIT 1