380

テーブルに行が存在するかどうかを調べようとしています。MySQL を使用して、次のようなクエリを実行する方がよいでしょうか。

SELECT COUNT(*) AS total FROM table1 WHERE ...

合計がゼロでないかどうか、または次のようなクエリを実行する方がよいかどうかを確認します。

SELECT * FROM table1 WHERE ... LIMIT 1

行が返されたかどうかを確認しますか?

どちらのクエリでも、WHERE 句はインデックスを使用します。

4

12 に答える 12

515

あなたも試すことができますEXISTS

SELECT EXISTS(SELECT * FROM table1 WHERE ...)

ドキュメントに従って、何でもできSELECTます。

伝統的に、EXISTS サブクエリは SELECT * で始まりますが、SELECT 5 や SELECT column1 などで始まる可能性があります。MySQL はそのようなサブクエリの SELECT リストを無視するため、違いはありません。

于 2009-11-04T20:59:36.317 に答える
210

私は最近、このテーマについていくつかの研究を行いました。フィールドが一意でないフィールドである TEXT フィールドである場合は、実装方法が異なる必要があります。

TEXT フィールドでいくつかのテストを行いました。1M エントリのテーブルがあるという事実を考慮してください。37 個のエントリが「何か」に等しい:

  • SELECT * FROM test WHERE text LIKE '%something%' LIMIT 1mysql_num_rows() : 0.039061069488525 秒。 (もっと早く)
  • SELECT count(*) as count FROM test WHERE text LIKE '%something% : 16.028197050095s.
  • SELECT EXISTS(SELECT 1 FROM test WHERE text LIKE '%something%'): 0.87045907974243 秒。
  • SELECT EXISTS(SELECT 1 FROM test WHERE text LIKE '%something%' LIMIT 1): 0.044898986816406 秒。

しかし、現在、BIGINT PK フィールドを使用すると、1 つのエントリのみが '321321' に等しくなります。

  • SELECT * FROM test2 WHERE id ='321321' LIMIT 1mysql_num_rows() : 0.0089840888977051 秒。
  • SELECT count(*) as count FROM test2 WHERE id ='321321': 0.00033879280090332 秒。
  • SELECT EXISTS(SELECT 1 FROM test2 WHERE id ='321321'): 0.00023889541625977 秒。
  • SELECT EXISTS(SELECT 1 FROM test2 WHERE id ='321321' LIMIT 1): 0.00020313262939453 秒。(もっと早く)
于 2012-05-21T15:23:13.127 に答える
33

@ChrisThompsonの答えの短い例

例:

mysql> SELECT * FROM table_1;
+----+--------+
| id | col1   |
+----+--------+
|  1 | foo    |
|  2 | bar    |
|  3 | foobar |
+----+--------+
3 rows in set (0.00 sec)

mysql> SELECT EXISTS(SELECT 1 FROM table_1 WHERE id = 1);
+--------------------------------------------+
| EXISTS(SELECT 1 FROM table_1 WHERE id = 1) |
+--------------------------------------------+
|                                          1 |
+--------------------------------------------+
1 row in set (0.00 sec)

mysql> SELECT EXISTS(SELECT 1 FROM table_1 WHERE id = 9);
+--------------------------------------------+
| EXISTS(SELECT 1 FROM table_1 WHERE id = 9) |
+--------------------------------------------+
|                                          0 |
+--------------------------------------------+
1 row in set (0.00 sec)

エイリアスの使用:

mysql> SELECT EXISTS(SELECT 1 FROM table_1 WHERE id = 1) AS mycheck;
+---------+
| mycheck |
+---------+
|       1 |
+---------+
1 row in set (0.00 sec)
于 2013-12-19T11:18:26.300 に答える
5

Countcount は常に db の使用に余分な負荷をかけ、レコードがそこにある場合は1SELECT 1を返すため、使用しないことをお勧めします。それ以外の場合は null を返し、それを処理できます。

于 2012-11-02T15:21:58.843 に答える
2

COUNTクエリは高速ですが、目立たないかもしれませんが、目的の結果が得られる限り、両方で十分です。

于 2009-11-04T20:58:31.703 に答える
-1

非 InnoDB テーブルの場合は、情報スキーマ テーブルも使用できます。

http://dev.mysql.com/doc/refman/5.1/en/tables-table.html

于 2009-11-04T21:12:33.693 に答える
-1

または、生の SQL 部分を条件に挿入して、 'conditions'=>array('Member.id NOT IN (SELECT Membership.member_id FROM members AS Membership)')を作成することもできます。

于 2014-10-29T09:08:02.727 に答える