![](/img/trans.png)
[英]SQL & PHP - Which is faster mysql_num_rows() or 'select count()'?
[英]SELECT COUNT() vs mysql_num_rows();
我有一個大表(60+)數百萬條記錄。
我正在使用 PHP 腳本來瀏覽此表。
PHP 腳本(帶分頁)加載速度非常快,因為:
表引擎是 InnoDB 因此SELECT COUNT()
非常慢並且mysql_num_rows()
不是一個選項,所以我將總行數(我用來生成分頁的數字)保存在一個單獨的表中(我更新了這個記錄total_rows=total_rows-1
和total_rows=total_rows1+1
在DELETE
和INSERT
期間)。
但問題是如何處理搜索結果的分頁?
現在我正在通過 2 個步驟執行此操作:
1.
$condition = " fname='rinchik' ";
$result = "SELECT * FROM my_large_table WHERE" . $condition;
在這里,我從數據庫中獲得了所有搜索結果。
2. 現在我需要計算這些結果來創建分頁。 我這樣做:
$condition; <- we already have this from the step 1
$result_count = "SELECT COUNT(id) FROM my_large_table WHERE" . $condition;
而且有點慢。
如果我這樣做(只需一步)會更好嗎?:
$condition = " fname='rinchik' ";
$result = "SELECT * FROM my_large_table WHERE" . $condition;
$result_count = mysql_num_rows($result);
使用COUNT
,服務器內部會以不同的方式處理請求。
執行COUNT
,服務器只會分配內存來存儲計數結果。
使用mysql_num_rows
,服務器將處理整個結果集,為所有這些結果分配內存,並將服務器置於獲取模式,這涉及許多不同的細節,例如鎖定。
把它想象成以下偽場景:
SELECT COUNT(*)
嘿鮑勃,教室里有多少人?
mysql_num_rows
嘿鮑勃,把教室里的所有人都派給我,......我會自己計算他們的人數
總之,當使用mysql_num_rows
您將所有記錄傳輸到客戶端,並且客戶端必須自己計算計數。
使用 COUNT(id)。 它只返回計數,用mysql_num_rows($result);
php 從 mysql 中獲取所有數據並計算找到的結果數。
最后,不要使用 mysql_* 函數。
建議的替代品
不鼓勵使用此擴展。 相反,應使用 MySQLi 或 PDO_MySQL 擴展。 另請參閱 MySQL:選擇 API 指南和相關常見問題以了解更多信息。 此功能的替代方案包括:
mysqli_stmt_num_rows() PDOStatement::rowCount()
在inoDB
引擎和 mysql 5.5 中測試。
id
有索引,我認為這非常快
$q = "SELECT count(`id`) FROM table where 1";
$rows = mysql_query($q);
$count = mysql_fetch_array($rows);
echo $count[0];
如果您想要更多,您必須僅在id
或您想要選擇的任何內容上使用一個索引。
緩存是另一種解決方案,您可以在幾毫秒內從一組記錄中進行選擇!
為什么您不只在一個請求中執行這兩個請求?
類似於: SELECT *, COUNT(*) AS nb FROM my_large_table
干杯
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.