データベースに特定のエントリが存在するかどうかを確認したい場合、2 つのオプションがあります。
COUNT() を使用して SQL クエリを作成し、結果が >0 かどうかを確認できます...
...または、レコードを取得して、返された行セットの行数を数えることもできます。たとえば、$result->num_rows; を使用します。
何が良い/速いですか?mysqlで?一般に?
YMMV ですが、存在を確認するだけで、取得したデータをまったく使用する必要がない場合は、COUNT() クエリの方が高速になると思います。どれだけ速くなるかは、データの量によって異なります。
最も速いのは、おそらく何かが存在するかどうかをデータベースに尋ねることです。
SELECT EXISTS ([your query here])
私にとってはデータベースにあります。
$result->num_rows では、2 つの操作を 1 つの選択にし、選択にカウントがある場合はカウントを行う方が結果を取得する方が速いため、count(1) を作成する方が $result->num_rows よりも高速です。データベースからの情報も必要な場合を除きます。
SELECT 1
FROM (SELECT 1) t
WHERE EXISTS( SELECT * FROM foo WHERE id = 42 )
テスト済み、MySQL v5 で正常に動作
次の場合、COUNT(*) は一般に効率が低下します。
単一のレコード (または 0) を生成することが保証されている WHERE 句に基づいて COUNT を実行しており、DBMS がこれを (UNIQUE インデックスに基づいて) 認識している場合、同様に効率的であるはずです。しかし、常にこの状態にあるとは考えにくいです。また、バージョンと DBMS によっては、DBMS が常にこれを検出するとは限りません。
アプリケーションでのカウント (行が必要ない場合) は、ほとんどの場合、遅くなる/悪化することが保証されています。
もちろん、行が存在する場合に何かを実行したい場合は、最初に行を取得して取得する方が確実に高速/最善です!
存在を確認するだけなら、
Select count(*) ...
ただし、データが存在する場合にデータを取得する場合は、データを取得して PHP で確認するだけです。それ以外の場合は、2 つの呼び出しが必要になります。
SELECT COUNT(*) FROM table
が最良の選択です。この操作は、小さなテーブルでも大きなテーブルでも非常に高速です。それは可能ですが、
SELECT id FROM table
小さなテーブルの方が速いため、速度の違いは微視的です。ただし、テーブルが大きい場合、この操作は非常に遅くなる可能性があります。
したがって、最善の策は、常に を選択することです (特定の を選択するよりもCOUNT(*) the table
実行する方が高速です)。全体として、それが最速の操作になります。*
column
生の速度が必要な場合は、ベンチマークしてください! 他の人が提案した方法に加えて:
SELECT 1 FROM table_name WHERE ... LIMIT 1
副選択を回避するため、より高速になる可能性があります。それをベンチマークします。
データベースの負荷を減らすために、私は間違いなくPHPでそれを行います。
カウントを取得し、返された行を SQL で取得するには、2 つのクエリを実行する必要があります..COUNT と SELECT です。
PHP の方法では、1 つの結果オブジェクトで必要なものがすべて提供されます。