2013-05-22 27 views
3

我想檢查條件的記錄> 15的天氣編號。在MySQL + PHP中計數記錄的最佳實踐

加速查詢的最佳做法是什麼?

1)

$query="SELECT `id` FROM `table` WHERE `name`='$name' AND `usage` > '$limit'"; 
$result=mysql_query($query);  
if(mysql_num_rows($result) >15) 
{ 
    //do task 

} 

2)

$query="SELECT COUNT(1) AS 'cnt' FROM `table` WHERE `name`='$name' AND `usage` > '$limit'"; 

$result=mysql_query($query); 
$row = mysql_fetch_assoc($result); 

if($row['cnt'] >15) 
{ 
    //do task 

} 

3)任何其他最佳方式?

+2

第二個一路。 – raina77ow

+2

['MySQL'](http://php.net/manual/en/book.mysql.php)('mysql_ *'函數)擴展名是[*** deprecated ***](http:// php。淨/手動/ EN/function.mysql-connect.php)。我建議使用['MySQLi'](http://php.net/manual/en/book.mysqli.php)('mysqli_ *'函數)或['PDO'](http://php.net/手冊/ en/book.pdo.php)。 – BlitZ

+0

#3。 SQL_CALC_FOUND_ROWS –

回答

3

首先,使用COUNT(*)由於MySQL是爲COUNT(*)進行了優化。其次,如果表非常大,那麼確保在WHERE子句中的列上有索引以加快執行速度。

+0

謝謝你的回覆。我只檢查> 15中是否有記錄。所以我認爲最好在查詢中添加LIMIT 16 – user2409005

0

u可以使用的代替COUNT(字段名)

$query="SELECT COUNT(id) as cnt FROM `table` WHERE `name`='$name' AND `usage` > '$limit'"; 

$result=mysql_query($query); 
$row = mysql_fetch_assoc($result); 

if($row['cnt'] >15) 
{ 
    //do task 

} 
0

,你可以自己去查兩個您發佈的代碼用這種方式:

$mt=microtime(true); 
/* your code */ 
$qt=microtime(true)-$mt; 
print "time elapsed: " . number_format($et) . "s\n"; 

我認爲單次使用第二個將是經濟的,但如果你必須遍歷值準備好的語句會更好。

0

顯然,第二個更好。在第一個查詢中,Mysql嘗試考慮一些系統資源來獲取並保留id列作爲結果集,如$result,特別是在大量數據中,這將是獲取更多時間執行查詢的重要原因。 但在第二個查詢中,它只是分配一個計數器變量,如cnt來顯示計數記錄。

另請注意,COUNT(id)不包括NULL值。那麼如果id根據定義可以設置爲NULL,則最好使用COUNT(*)或根據您的選擇來計算NULL的值。