【问题标题】:MySQL Subquery OptimizationMySQL 子查询优化
【发布时间】:2011-11-27 21:02:08
【问题描述】:

查询:

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);

...但它仅在子查询为空时有效。如果有结果,则查询失败。

-- 我不想将查询格式从嵌套更改为加入/等。

想法..?谢谢!

-- 编辑:另外,我忘了补充:子查询可能会产生一个相当大的结果列表,而不仅仅是一个结果。 --- 另外,当我输入“555”时,我指的是列中永远不会存在的值。

-- 编辑 2:我还尝试了以下查询,它“有效”,但是当它有结果时,它仍然需要比原始查询长几个数量级:

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

【问题讨论】:

    标签: mysql query-optimization subquery


    【解决方案1】:

    猜测(我现在无法测试):

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

    【讨论】:

    • 啊,非常好的想法。这同样有效,但不幸的是,它仍然遇到与我的 [edit 2] 尝试相同的问题:当它有结果时,它比原始查询花费的时间长几个数量级。
    • @Lucas - 很奇怪。当没有数据返回时,单独运行内部查询是否也会更长?加号 - b 在 table1 中被索引,并且 c 被索引?
    • 确实很奇怪!是的,当值不存在时,单独运行内部查询具有相同的膨胀时间。是的,所有 3 列都是单独索引的。 -- 旁注:我更喜欢你的查询而不是我的 [edit 2] 查询,所以如果没有别的,我肯定会使用它并忍受时间膨胀。
    • 精准!不知何故,我在之前的转换中丢失了一个索引。这已经纠正了时间问题。谢谢!
    • 其实EXISTS里面没有必要使用LIMIT。
    猜你喜欢
    • 2021-04-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多