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は2つのクエリを渡すことを好まないようです。では、どうすればそれを行うことができますか?

4

7 に答える 7

28

SQL_CALC_FOUND_ROWSLIMIT句を使用しているが、。がないと見つかった行数を知りたい場合にのみ役立ちますLIMIT

これがどのように機能するかを考えてください。

SELECT SQL_CALC_FOUND_ROWS * FROM Users;

データベースにテーブル内のすべてのデータを取得/解析するように強制し、それを破棄します。どの行も取得しない場合でも、DBサーバーは、データが必要であると想定して、ディスクから実際のデータのプルを開始します。

人間の言葉で言えば、あなたはスーパー食料品店の内容物をすべて購入しましたが、レジ係のスタンドからガムのパックを除いてすべてを捨てました。

一方、実行中:

SELECT count(*) FROM users;

DBエンジンに、行数を知りたいが、実際のデータについてはあまり気にしないことを知らせます。ほとんどのインテリジェントDBMSでは、エンジンは、ディスク上の行データに触れることなく、テーブルのメタデータからこのカウントを取得するか、テーブルの主キーインデックスを簡単に実行できます。

于 2010-08-11T03:50:47.493 に答える
23

その2つのクエリ:

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

PHPは、mysql_query呼び出しごとに1つのクエリのみを発行できます

于 2010-08-10T22:02:40.107 に答える
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/

質問に答えるには:マニュアルで説明されているように、1回のmysql_query呼び出しごとに1つのクエリのみが許可されます。mysql_query() sends a unique query (multiple queries are not supported)

ext/mysqliMySQL拡張機能として使用する場合、複数のクエリがサポートされます。

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

'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'];
于 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 に答える