MySQL没有在带有“IN”的子选择的外部查询上使用键

时间:2010-03-09 13:04:09

标签: mysql performance key subquery

我正在查询这样的数据库:

 SELECT * from Log WHERE cookieId IN (select cookieId from Log WHERE someId="blafasel");

我在someId和cookieId上有键,但查询速度很慢。 如果我运行两个查询(外部和内部)将它们分开或非常快。

 select cookieId from Log WHERE someId="blafasel"

几乎立刻就能得到结果。查询也是如此

 SELECT * FROM Log WHERE cookieId IN ("something","somethingelse","athirdoption")

使用EXPLAIN告诉我在两个单个查询中使用了键,但是对于subselect查询键仅用于内部选择。我的问题是为什么?如何告诉MySQL更聪明一点。

好吧,我可以让我的应用程序分开运行两个查询,但这不方便。

感谢您的帮助。

3 个答案:

答案 0 :(得分:7)

您是否尝试过使用

SELECT  l.*
FROM    log l INNER JOIN
        log ls ON l.cookieid = ls.cookieid
WHERE   ls.someId="blafasel"

答案 1 :(得分:0)

你试过这个吗?

SELECT * from Log WHERE someId="blafasel";

我想你的真实查询有点不同,但万一它不是。

另外,解释是否在“可能的键”列中显示正确的键?如果是这样,您可以尝试在外部选择上使用“强制索引(index_name)”子句来查看是否加快了它。

答案 2 :(得分:0)