2011-09-29 113 views
1

查询:MySQL的子查询优化

SELECT a FROM table1 WHERE b IN (SELECT b FROM table1 WHERE c = 2); 

如果子查询返回结果为零,MySQL的需要很长的时间来实现它,它最终会返回一个空的结果之前。 (子查询为空时为2.5s,子查询结果为0.0005s)。

我的问题:有没有办法修改查询,使它仍然会返回一个空的结果,但采取与结果时一样的时间?

我想:

SELECT a FROM table1 WHERE b IN ((SELECT b FROM table1 WHERE c = 2), 555); 

...但它只能当子查询为空。如果有结果,查询失败。

- 我不想改变查询格式从嵌套到加入/ etc。

想法..?谢谢!

- 编辑:此外,我忘了补充:子查询可能会导致一个体面的结果列表,而不仅仅是一个结果。 ---另外,当我输入“555”时,我指的是在列中不会存在的值。

- 编辑2:我也尝试下面的查询和它“作品”,但它仍然需要几个数量级长于当它有结果原始查询:

SELECT a FROM table1 WHERE b IN (SELECT 555 AS b UNION SELECT b FROM table1 WHERE c = 2); 

回答

2

胡乱猜测(我可以现在不试验):

SELECT a FROM table1 WHERE 
EXISTS (SELECT b FROM table1 WHERE c = 2) 
AND b IN (SELECT b FROM table1 WHERE c = 2); 
+0

啊,非常好的想法。这同样适用,但不幸的是,它仍然会遇到与我的[编辑2]尝试相同的问题:当它有结果时,它比原始查询的时间要长几个数量级。 – Lucas

+0

@卢卡斯 - 很奇怪。在没有数据返回的情况下单独运行内部查询的时间也会长得多?加 - 是b索引在table1中,并被c编入索引? – Galz

+0

确实很奇怪!是的,当一个值不存在时,单独运行内部查询具有相同的通胀时间。是的,所有3列都是单独索引的。 - 侧面说明:我喜欢你的查询比我的[编辑2]查询更好,所以如果没有别的,我肯定会使用它,并承受通货膨胀的时间。 – Lucas