簡體   English   中英

SELECT COUNT() 與 mysql_num_rows();

[英]SELECT COUNT() vs mysql_num_rows();

我有一個大表(60+)數百萬條記錄。

我正在使用 PHP 腳本來瀏覽此表。

PHP 腳本(帶分頁)加載速度非常快,因為:

表引擎是 InnoDB 因此SELECT COUNT()非常慢並且mysql_num_rows()不是一個選項,所以我將總行數(我用來生成分頁的數字)保存在一個單獨的表中(我更新了這個記錄total_rows=total_rows-1total_rows=total_rows1+1DELETEINSERT期間)。

但問題是如何處理搜索結果的分頁?

現在我正在通過 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM