2010-08-10 66 views
20

由於性能問題,我儘量避免使用Count()。 (即SELECT COUNT()的使用者)如何在PHP中使用MySQL Found_Rows()?

如果我運行在phpMyAdmin以下內容,它是確定:

SELECT SQL_CALC_FOUND_ROWS * FROM Users; 
    SELECT FOUND_ROWS(); 

它將返回行#。即#個用戶。

但是,如果我在PHP運行,我不能做到這一點:

$query = 'SELECT SQL_CALC_FOUND_ROWS * FROM Users; 
    SELECT FOUND_ROWS(); '; 
    mysql_query($query); 

它看起來像PHP不喜歡有兩個查詢傳遞所以,我怎麼能做到這一點?

+4

這就是我們所說的「過早優化」 ...... – 2010-08-27 07:16:34

+0

順便說一句,你不能用'的mysql_query送2個查詢()'。您必須分別發送每個查詢。如果您想一次發送多個數據庫界面,請使用其他數據庫界面。 – 2013-11-08 20:12:54

回答

27

SQL_CALC_FOUND_ROWS僅僅是有用的,如果您使用的是LIMIT條款,但還是想知道有多少行就已經發現沒有LIMIT

想到如何工作的:

SELECT SQL_CALC_FOUND_ROWS * FROM Users; 

你迫使數據庫檢索/表中分析所有的數據,然後你把它扔掉。即使您不想檢索任何行,數據庫服務器仍會開始從磁盤中提取實際數據,假定您需要該數據。

對人類而言,你買的超級雜貨店的全部內容,但丟掉了一切,除了膠從待機收銀員包。

然而,這樣做的:

SELECT count(*) FROM users; 

讓DB引擎知道,當你想知道有多少行有,你可以不關心實際的數據。在大多數智能數據庫管理系統中,引擎可以從表的元數據中檢索此計數,或者通過表的主鍵索引簡單運行,而無需觸及磁盤上的行數據。

+0

絕對正確,但是如果我將用戶分組並且想要計算現在有多少組由這些組分組?這是一個簡單的例子,我在現實生活中有更復雜的羣體。 – Radamanf 2013-04-10 15:58:20

+0

用於比喻。輝煌! – Roger 2014-08-21 19:39:34

+0

我有一個包含'limit'子句的查詢。現在我想用'found_rows()'來選擇有限的數據和總匹配結果的數量。怎麼樣?我想要[this]這樣的東西(http://stackoverflow.com/questions/33889922/how-to-get-the-number-of-total-results-when-there-is-limit-in-query#33889982) *(這不起作用)* – Shafizadeh 2015-11-24 12:31:09

22

它的兩個疑問:

$query = 'SELECT SQL_CALC_FOUND_ROWS * FROM Users'; 
mysql_query($query); 
$query = 'SELECT FOUND_ROWS()'; 
mysql_query($query); 

PHP只能發出每次的mysql_query喊單查詢

0

你真的認爲,從表中選擇所有行比計算他們更快?
Myisam在表的元數據中存儲了一些記錄,所以SELECT COUNT(*)FROM表不需要訪問數據。

5

這是一個普遍的誤解,認爲SQL_CALC_FOUND_ROWS執行比COUNT更好的()。來自Percona的人看到這個對比:使用ext/mysqli爲您的MySQL擴展時mysql_query() sends a unique query (multiple queries are not supported)

多個查詢,支持:http://www.mysqlperformanceblog.com/2007/08/28/to-sql_calc_found_rows-or-not-to-sql_calc_found_rows/

要回答你的問題:只有一個查詢每一個的mysql_query調用允許的,在手冊中描述

http://www.php.net/manual/en/mysqli.multi-query.php

3

使用「聯盟」和空列:

$sql="(select sql_calc_found_rows tb.*, tb1.title 
     from orders tb 
      left join goods tb1 on tb.goods_id=tb1.id 
     where {$where} 
     order by created desc 
     limit {$offset}, {$page_size}) 
     union 
     (select found_rows(), '', '', '', '', '', '', '', '', '') 
    "; 
$rs=$db->query($sql)->result_array(); 
$total=array_pop($rs); 
$total=$total['id']; 
2

僅此代碼對我的作品,所以我想分享給你。

$Result=mysqli_query($i_link,"SELECT SQL_CALC_FOUND_ROWS id From users LIMIT 10"); 
$NORResult=mysqli_query($i_link,"Select FOUND_ROWS()"); 
$NORRow=mysqli_fetch_array($NORResult); 
$NOR=$NORRow["FOUND_ROWS()"]; 
echo $NOR; 
2

這是一個簡單的方法&工作對我來說:

$query = " 
SELECT SQL_CALC_FOUND_ROWS * 
FROM tb1 
LIMIT 5"; 

$result = mysql_query($query); 

$query = "SELECT FOUND_ROWS() AS count"; 
$result2 = mysql_query($query); 

$row = mysql_fetch_array($result2); 

echo $row['count'];