21

PDOを使用するクエリを作成し、最初に行をカウントし、行> 1の場合はデータをフェッチします

SELECT * WHERE id=:id
$row=$SQL->rowCount();

if($row>0){
    while($data=$SQL->fetch(PDO::FETCH_ASSOC)){...

    }
}
else{echo "no result";}

また

SELECT COUNT(*), * WHERE id=:id
$data=fetch(POD::FETCH_NUM);
$row=data[0];


if($row>0){
//fetch data
}
else{echo "no result";}

どちらがより良いパフォーマンスになりますか?

2番目。質問、IDにインデックスを設定した場合

どちらが良いCOUNT(id)か、COUNT(*)

4

5 に答える 5

24

最初の質問:

count を使用COUNT()すると、サーバー (MySQL) は内部的にリクエストを異なる方法で処理します。

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

サーバー (Apache/PHP) を使用$row=$SQL->rowCount();する場合、結果セット全体を処理し、それらすべての結果にメモリを割り当て、サーバーをフェッチ モードにします。これには、ロックなど、さまざまな詳細が含まれます。

PDOStatement::rowCount()返される行数ではなく、最後のステートメントによって影響を受けた行数を返すことに注意してください。関連によって実行された最後の SQL ステートメントがステートメントでPDOStatementあったSELECT場合、一部のデータベースは、そのステートメントによって返された行数を返す場合があります。ただし、この動作はすべてのデータベースで保証されているわけではなく、移植可能なアプリケーションに依存するべきではありません。

私の分析では、 を使用するCOUNT()と MySQL と PHP の両方にプロセスが分割され、 を使用すると PHP$row=$SQL->rowCount();の処理が多くなります。

したがってCOUNT()、MySQL の方が高速です。

2 番目の質問:

COUNT(*)よりも優れていCOUNT(id)ます。

説明:

mysqlのcount(*)関数は、値のカウントを見つけるように最適化されています。ワイルドカードを使用すると、すべての行がフェッチされるわけではありません。カウントを見つけるだけです。したがって、count(*)可能な限り使用してください。

ソース:

于 2013-10-01T07:06:00.447 に答える
1

どちらの場合も 1 つのクエリしか発行していないため、パフォーマンスの違いは無視して null にする必要があります。2 番目のクエリは、一致する行ごとに同じ値を持つ追加の列をフェッチする必要idがあるため、メモリ フットプリントが大きくなる可能性があります。行数がなくてCOUNT(*)も利用できるはずなので、最初のソリューションを使用する必要があります。

2番目の質問については、データベースエンジンが問題の行を取得するために範囲スキャンを実行する必要があり、インデックス付きの列でフィルタリングするときにインデックスを使用すると範囲スキャンが高速になるため、インデックスをオンにすると、AFAIKのいずれかCOUNT(id)またはの方が高速になります(ケース)。COUNT(*)idid = SOME_ID

于 2013-10-01T07:00:47.093 に答える
1

Count(*)より速くなります。

PDOStatement::rowCount()PDOのドキュメントに従って動作することは保証されていません:

「すべてのデータベースで保証されているわけではなく、移植可能なアプリケーションに依存するべきではありません。」

したがって、あなたの場合は、を使用することをお勧めしcount(*)ます。

リファレンスを参照してください: pdostatement.rowcount マニュアル

于 2013-10-01T07:06:25.473 に答える