(可能是重复的,但我只能找到与JOIN [3]
的问题和解决方案,这就是不是一个选项)哪个子查询更快?
我有两个表。非常薄(很少列)和非常长(很多行)。一个是数据表(articles
),另一个是ACL表(acl
)。
我想只显示通过acl.some_id
访问的文章。哪个子查询更快?
[1]
SELECT a.title
FROM articles a
WHERE 0 < (
SELECT COUNT(1)
FROM acl
WHERE article_id = a.id AND some_id IN (1, 2, 3)
)
或
[2]
SELECT a.title
FROM articles a
WHERE a.id IN (
SELECT article_id
FROM acl WHERE some_id IN (1, 2, 3)
)
我心中想说的第二个,因为子查询可重复使用的所有潜在的匹配行,因此将只执行一次(虽然结果集将是非常大的),而第一个子查询将不得不检查每一个可能匹配的行。
还有第三种方法,但这是不是一个选项,因为它会重复行(和GROUP BY不是解决方案,因为我需要COUNT以后的其他东西(和DISTINCT永远不是解决方案!)):
[3]
SELECT a.title
FROM articles a
JOIN acl
ON acl.article_id = a.id
WHERE acl.some_id IN (1, 2, 3)
由于article_id的X存在N次acl
,它将返回该行0 - N次,而不是0 - 1
还有第四个方法:EXISTS
。感谢ypercube。
相关:
你写的代码... **尝试它,并找出来!** – 2013-03-20 22:20:07
尝试一次或15次并不意味着什么。我想要为什么。而且这些表格还不长=),所以执行时间将非常非常短。 – Rudie 2013-03-20 22:21:32
mysql拥有你需要自己回答这个问题的所有工具。查看每个查询的执行计划。查看执行时间。你可以这样做。 – 2013-03-20 22:24:11