由于性能问题,我尽量避免使用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不喜欢传入两个查询。那么,我该怎么做呢?
答案 0 :(得分:28)
SQL_CALC_FOUND_ROWS
仅在您使用LIMIT
子句时才有用,但仍想知道在没有LIMIT
的情况下会找到多少行。
想想这是如何运作的:
SELECT SQL_CALC_FOUND_ROWS * FROM Users;
您强制数据库检索/解析表中的所有数据,然后将其丢弃。即使您不打算检索任何行,数据库服务器仍会开始从磁盘中提取实际数据,前提是您需要这些数据。
从人的角度来说,你买了超级杂货店的全部内容,但除了收银台外的一包口香糖外,还扔掉了。
然而,做:
SELECT count(*) FROM users;
让数据库引擎知道,虽然您想知道有多少行,但您可能不关心实际数据。在大多数智能DBMS上,引擎可以从表的元数据中检索此计数,或者通过表的主键索引进行简单的运行,而不会触及磁盘上的行数据。
答案 1 :(得分:23)
它的两个问题:
$query = 'SELECT SQL_CALC_FOUND_ROWS * FROM Users';
mysql_query($query);
$query = 'SELECT FOUND_ROWS()';
mysql_query($query);
PHP每个mysql_query调用只能发出一个查询
答案 2 :(得分: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/mysqli
作为MySQL扩展时支持多个查询:
答案 3 :(得分:3)
使用' union'和空列:
$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'];
答案 4 :(得分:3)
只有这段代码适合我,所以我想为你分享。
$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;
答案 5 :(得分: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'];
答案 6 :(得分:0)
你真的认为从表中选择所有行比计算它们更快吗? Myisam在表的元数据中存储了许多记录,因此SELECT COUNT(*)FROM table不必访问数据。