24

由于性能问题,我尽量避免执行 Count( )。(即 SELECT COUNT( ) FROM Users)

如果我在 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

7 回答 7

28

SQL_CALC_FOUND_ROWS仅当您使用LIMIT子句时才有用,但仍想知道没有LIMIT.

想想这是如何工作的:

SELECT SQL_CALC_FOUND_ROWS * FROM Users;

您正在强制数据库检索/解析表中的所有数据,然后将其丢弃。即使您不打算检索任何行,数据库服务器仍将开始从磁盘中提取实际数据,假设您需要该数据。

用人类的话说,你买了超级杂货店的所有东西,但除了收银员摊位上的那包口香糖外,其他东西都扔掉了。

鉴于,做:

SELECT count(*) FROM users;

让数据库引擎知道,虽然您想知道有多少行,但您不能不在乎实际数据。在大多数智能 DBMS 上,引擎可以从表的元数据中检索此计数,或者通过表的主键索引进行简单的运行,而无需接触磁盘上的行数据。

于 2010-08-11T03:50:47.493 回答
23

它的两个查询:

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

PHP 每个 mysql_query 调用只能发出一个查询

于 2010-08-10T22:02:40.107 回答
5

It's a common misconception, that SQL_CALC_FOUND_ROWS performs better than COUNT(). See this comparison from Percona guys: http://www.mysqlperformanceblog.com/2007/08/28/to-sql_calc_found_rows-or-not-to-sql_calc_found_rows/

To answer you question: Only one query is allowed per one mysql_query call, as described in manual: mysql_query() sends a unique query (multiple queries are not supported)

Multiple queries are supported when using ext/mysqli as your MySQL extension:

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

于 2010-08-10T22:21:43.030 回答
4

只有这段代码对我有用,所以我想为你分享。

$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;
于 2015-05-05T23:20:28.093 回答
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'];
于 2014-10-16T09:41:47.720 回答
3

这是一种简单的方法并且对我有用:

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

$result = mysqli_query($link, $query);

$query = "SELECT FOUND_ROWS() AS count";
$result2 = mysqli_query($link, $query);

$row = mysqli_fetch_array($result2);

echo $row['count'];
于 2015-09-07T22:10:01.363 回答
0

你真的认为从表中选择所有行比计算它们更快吗?
Myisam 在表的元数据中存储了许多记录,因此 SELECT COUNT(*) FROM 表不必访问数据。

于 2010-08-10T22:03:31.623 回答