我试图找出一行是否存在于一个表中。使用MySQL,是更好的做这样的查询:
SELECT COUNT(*) AS total FROM table1 WHERE ...
然后检查总数是否为非零,或者像这样查询是否更好:
SELECT * FROM table1 WHERE ... LIMIT 1
并检查是否返回了任何行?
在这两个查询中,WHERE子句都使用索引。
我试图找出一行是否存在于一个表中。使用MySQL,是更好的做这样的查询:
SELECT COUNT(*) AS total FROM table1 WHERE ...
然后检查总数是否为非零,或者像这样查询是否更好:
SELECT * FROM table1 WHERE ... LIMIT 1
并检查是否返回了任何行?
在这两个查询中,WHERE子句都使用索引。
当前回答
COUNT查询更快,虽然可能不是很明显,但就获得所需的结果而言,两者都应该足够了。
其他回答
你也可以试试EXISTS:
SELECT EXISTS(SELECT * FROM table1 WHERE ...)
根据文档,你可以选择任何东西。
传统上,EXISTS子查询以SELECT *开头,但也可以这样 以SELECT 5或SELECT column n1或任何东西开始。MySQL 在这样的子查询中忽略SELECT列表,所以没有区别。
或者您可以将原始sql部分插入到条件中 所以我有 “条件”= >阵列('成员。id不在(选择会员。member_id FROM memberships AS Membership)')
下面是@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)
COUNT查询更快,虽然可能不是很明显,但就获得所需的结果而言,两者都应该足够了。
对于非innodb表,你也可以使用信息模式表:
http://dev.mysql.com/doc/refman/5.1/en/tables-table.html