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]尝试相同的问题:当它有结果时,它比原始查询的时间要长几个数量级。 – Lucas
@卢卡斯 - 很奇怪。在没有数据返回的情况下单独运行内部查询的时间也会长得多?加 - 是b索引在table1中,并被c编入索引? – Galz
确实很奇怪!是的,当一个值不存在时,单独运行内部查询具有相同的通胀时间。是的,所有3列都是单独索引的。 - 侧面说明:我喜欢你的查询比我的[编辑2]查询更好,所以如果没有别的,我肯定会使用它,并承受通货膨胀的时间。 – Lucas