12

私は何百万ものレコードを持つ大きなテーブル (60+) を持っています。

このテーブルをナビゲートするために PHP スクリプトを使用しています。

PHP スクリプト (ページネーション付き) は、次の理由で非常に高速に読み込まれます。

テーブル エンジンは InnoDBSELECT COUNT()であるため非常に遅くmysql_num_rows()、オプションではないため、合計行数 (ページネーションの生成に使用する数) を別のテーブルに保持します (このレコードtotal_rows=total_rows-1を更新し、実行total_rows=total_rows1+1DELETEINSERT)。

しかし問題は、検索結果のページネーションをどうするかということです。

現在、私は2つのステップでこれを行っています:

1.

$condition = " fname='rinchik' ";
$result = "SELECT * FROM my_large_table WHERE" . $condition;

ここでは、DataBase からすべての検索結果を取得しました。

2. 次に、これらの結果を数えてページネーションを作成する必要があります。私はこれをやっています:

$condition; <- we already have this from the step 1
$result_count = "SELECT COUNT(id) FROM my_large_table WHERE" . $condition;

そして、それはちょっと遅いです。

このように(1ステップだけで)行うとよいでしょうか?:

$condition = " fname='rinchik' ";
$result = "SELECT * FROM my_large_table WHERE" . $condition;
$result_count = mysql_num_rows($result);
4

3 に答える 3

45

を使用するCOUNTと、サーバーは内部的にリクエストを別の方法で処理します。

を実行COUNTすると、サーバーはカウントの結果を格納するためだけにメモリを割り当てます。

を使用するmysql_num_rowsと、サーバーは結果セット全体を処理し、それらすべての結果にメモリを割り当て、サーバーをフェッチ モードにします。これには、ロックなど、さまざまな詳細が含まれます。

次の疑似シナリオのように考えてください。

SELECT COUNT(*)

ねえボブ、教室には何人いる?

mysql_num_rows

ねぇボブ、教室の全員を私のところに送ってくれ…人数は自分で数えてみよう

要約すると、使用mysql_num_rowsするとすべてのレコードがクライアントに転送され、クライアントはカウント自体を計算する必要があります。

于 2012-10-12T17:58:38.877 に答える
3

COUNT(id) を使用します。それはカウントを返すだけで、mysql_num_rows($result);php は mysql からすべてのデータを取得し、見つかった結果の数をカウントします。

最後に、mysql_* 関数を使用しないでください。

推奨される代替案

この拡張機能の使用はお勧めできません。代わりに、MySQLi または PDO_MySQL 拡張機能を使用する必要があります。詳細については、MySQL: API ガイドの選択および関連する FAQ も参照してください。この機能の代替手段は次のとおりです。

mysqli_stmt_num_rows() PDOStatement::rowCount()

于 2012-10-12T17:55:52.903 に答える