2010-03-20 113 views
28

我只是想知道哪種方法是最有效的,如果我真的只想獲得表中的行數。SQL&PHP - 哪個更快mysql_num_rows()或'select count()'?

$res = mysql_query("SELECT count(*) as `number` FROM `table1`"); 
$count = mysql_fetch_result($res,0,'number'); 

$res = mysql_query("SELECT `ID` FROM `table1`"); 
$count = mysql_num_rows($res); 

任何人都對此做出像樣的測試?

回答

30

mysql_query()轉移從MySQL中的所有結果記錄到PHP pcrocess返回(不像mysql_unbufferd_query())前。僅此一項就會使mysql_num_rows()版本變慢。

此外,對於某些引擎(如MyISAM),MySQL可以服務來自表without hitting the actual data的索引的Count(*)請求。另一方面,一個SELECT * FROM foo導致全表掃描,MySQL必須讀取每一個數據集。

+0

謝謝大家對你的帖子,不得不挑一個。 VolkerK的回答是明確的和內容豐富的。謝謝 :) – Joel

0

我猜count(1)會更快:

$res = mysql_query("SELECT count(1) as `number` FROM `table1`"); 
$count = mysql_fetch_result($res,0,'number'); 

雖然還沒有試過所提出的方法,首先使數據庫獲取所有記錄,並在數據庫中數得過來,第二使數據庫獲取一個單獨的字段記錄所有記錄並計算服務器上的結果數量。
作爲一條經驗法則,您爲特定記錄獲取的數據越少,需要的時間就越少,因此我會爲更新後的第一個方法投票(爲每個記錄提取常量並計算提取的常量數量)。

+1

如果存儲引擎是MyISAM和療法e不是'WHERE'條件,'count(*)'會更快,因爲MyISAM表存儲確切的記錄計數。 –

+1

您的猜測可能會適得其反 - COUNT(*)是獲取結果集大小的常用方式,任何值得其鹽值的數據庫都會針對它進行優化。 –

+2

與Count(colname)相對,Count(*)中的*表示「不看數據,只計數記錄」。 – VolkerK

0

我真的不認爲需要任何測試。

在做COUNT在SQL查詢

1)僅發送一個數據行的背 客戶(而不是每行)

2)讓SQL做計數 你這是可能總是要 比PHP更快。

6

絕對是第一個。 MySQL通常可以通過查看索引而不是整個表來執行此操作,如果使用MyISAM(缺省值),則表的行計數將存儲在表元數據中,並將立即返回

您的第二種方法不僅將整個表讀入內存,還會在客戶端對行進行計數之前通過網絡將其發送到客戶端。非常浪費!

-3

在索引和inodb中使用Count使其變得非常緩慢,但是當與mysqli_num_rows一起使用時,它會毫不遲延地返回。你可以檢查mysqli_num_rows結果http://ssajalandhar.org/generalinstruction-0-1-0.html它不會需要秒的小數加載。對我來說,mysqli的作品非常棒。

6

在數據庫測試與更多然後2300000行,類型:InnoDB的,接近1吉布大小,使用XHProf的

TEST1:

....SELECT COUNT(id) as cnt FROM $table_name....; 
     row= mysqli_fetch_assoc($res2); 
    echo $row['cnt']; 
     //result1: 
     1,144,106 
     1,230,576 
     1,173,449 
     1,163,163 
     1,218,992 

TEST2:

....SELECT COUNT(*) as cnt FROM $table_name....; 
     row= mysqli_fetch_assoc($res2); 
    echo $row['cnt']; 
//result2: 
1,120,253 
1,118,243 
1,118,852 
1,092,419 
1,081,316 

TEST3:

....SELECT * FROM $table_name....; 
    echo mysqli_num_rows($res2); 
    //result3: 
7,212,476 
6,530,615 
7,014,546 
7,169,629 
7,295,878 

TEST4:

 ....SELECT * FROM $table_name....; 
     echo mysqli_num_rows($res2); 
     //result4: 
1,441,228 
1,671,616 
1,483,050 
1,446,315 
1,647,019 

結論: 最快的方法是在測試2:

....SELECT COUNT(*) as cnt FROM $table_name....; 
     row= mysqli_fetch_assoc($res2); 
    echo $row['cnt'];