我试图找出一行是否存在于一个表中。使用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列表,所以没有区别。
COUNT查询更快,虽然可能不是很明显,但就获得所需的结果而言,两者都应该足够了。
对于非innodb表,你也可以使用信息模式表:
http://dev.mysql.com/doc/refman/5.1/en/tables-table.html
我觉得值得指出的是,尽管评论中提到了这一点,但在这种情况下:
SELECT 1 FROM my_table WHERE *indexed_condition* LIMIT 1
优于:
SELECT * FROM my_table WHERE *indexed_condition* LIMIT 1
这是因为第一个查询可以通过索引来满足,而第二个查询则需要行查找(除非可能表的所有列都在所使用的索引中)。
添加LIMIT子句允许引擎在找到任何行后停止。
第一个查询应该类似于:
SELECT EXISTS(SELECT * FROM my_table WHERE *indexed_condition*)
它向引擎发送相同的信号(1/*在这里没有区别),但我仍然会写1来加强使用EXISTS时的习惯:
SELECT EXISTS(SELECT 1 FROM my_table WHERE *indexed_condition*)
如果在没有匹配的行时需要显式返回,那么添加EXISTS包装可能是有意义的。
COUNT(*)在MySQL中进行了优化,所以一般来说,前者查询可能更快。