我试图找出一行是否存在于一个表中。使用MySQL,是更好的做这样的查询:

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

然后检查总数是否为非零,或者像这样查询是否更好:

SELECT * FROM table1 WHERE ... LIMIT 1

并检查是否返回了任何行?

在这两个查询中,WHERE子句都使用索引。


当前回答

或者您可以将原始sql部分插入到条件中 所以我有 “条件”= >阵列('成员。id不在(选择会员。member_id FROM memberships AS Membership)')

其他回答

在我的研究中,我可以发现结果越来越快。

select * from table where condition=value
(1 total, Query took 0.0052 sec)

select exists(select * from table where condition=value)
(1 total, Query took 0.0008 sec)

select count(*) from table where condition=value limit 1) 
(1 total, Query took 0.0007 sec)

select exists(select * from table where condition=value limit 1)
(1 total, Query took 0.0006 sec) 

我选COUNT(1)。它比COUNT(*)快,因为COUNT(*)测试该行中是否至少有一列是!= NULL。您不需要这样做,特别是因为您已经有了一个条件(WHERE子句)。COUNT(1)测试1的有效性,它总是有效的,并且测试所需的时间要少得多。

对于非innodb表,你也可以使用信息模式表:

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

建议你不要使用Count,因为Count总是为db做额外的负载,使用SELECT 1,如果你的记录在那里,它返回1,否则它返回null,你可以处理它。

或者您可以将原始sql部分插入到条件中 所以我有 “条件”= >阵列('成员。id不在(选择会员。member_id FROM memberships AS Membership)')