如何在PHP中使用MySQL Found_Rows()?

mur*_*lai 23 php mysql sql-calc-found-rows

由于性能问题,我尽量避免使用Count().(即SELECT COUNT()FROM Users)

如果我在phpMyAdmin中运行以下命令,则可以:

  SELECT SQL_CALC_FOUND_ROWS * FROM Users;
  SELECT FOUND_ROWS();
Run Code Online (Sandbox Code Playgroud)

它将返回行数#.即用户数量.

但是,如果我在PHP中运行,我不能这样做:

  $query = 'SELECT SQL_CALC_FOUND_ROWS * FROM Users;
    SELECT FOUND_ROWS(); ';
  mysql_query($query);
Run Code Online (Sandbox Code Playgroud)

似乎PHP不喜欢传入两个查询.那么,我该怎么做呢?

Mar*_*c B 28

SQL_CALC_FOUND_ROWS只有在你使用一个LIMIT子句时才有用,但是仍然想知道在没有子句的情况下会找到多少行LIMIT.

想想这是如何工作的:

SELECT SQL_CALC_FOUND_ROWS * FROM Users;
Run Code Online (Sandbox Code Playgroud)

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

从人的角度来说,你买了超级杂货店的全部内容,但除了收银台的支架上的一包口香糖之外扔掉了.

然而,做:

SELECT count(*) FROM users;
Run Code Online (Sandbox Code Playgroud)

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


Joc*_*ung 23

它的两个问题:

$query = 'SELECT SQL_CALC_FOUND_ROWS * FROM Users';
mysql_query($query);
$query = 'SELECT FOUND_ROWS()';
mysql_query($query);
Run Code Online (Sandbox Code Playgroud)

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


Mch*_*chl 5

这是一种常见的误解,即SQL_CALC_FOUND_ROWS的性能优于COUNT().看到Percona的家伙这种比较:http://www.mysqlperformanceblog.com/2007/08/28/to-sql_calc_found_rows-or-not-to-sql_calc_found_rows/

回答你的问题:每个mysql_query调用只允许一个查询,如手册中所述: mysql_query() sends a unique query (multiple queries are not supported)

使用ext/mysqliMySQL扩展时支持多个查询:

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