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调用只能发出一个查询
这是一种常见的误解,即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/mysqli
MySQL扩展时支持多个查询:
http://www.php.net/manual/en/mysqli.multi-query.php