【问题标题】:Does a SQL UNION with a LIMIT optimize away uneeded queries?带有 LIMIT 的 SQL UNION 是否优化了不需要的查询?
【发布时间】:2011-02-11 10:06:25
【问题描述】:

假设我有一系列查询,这些查询逐渐变得更加昂贵。我可以通过工会加入所有这些,但我只对前 10 名结果感兴趣,所以我添加了一个 LIMIT。查询看起来像这样:

(SELECT col1, col2 FROM table WHERE colx = 'x')
UNION
(SELECT col1, col2 FROM table WHERE colx LIKE '%x%')
UNION
(SELECT col1, col2 FROM table WHERE colx LIKE '%x%' AND unindexedcol LIKE '%y%')
LIMIT 10

我知道这并不能保证是 MySQL 文档所述的第一个查询的前 10 名

UNION 默认产生一个无序的 行集

但实际上,结果似乎是按顺序选择 1,然后是选择 2,以此类推,直到达到限制。

那么 MySQL 是按顺序执行查询并在达到限制时停止吗?如果不是,那么在只需要结果子集并且优先考虑成本较低的查询以最小化执行时间的情况下,执行这种查询方式的更好方法是什么?

【问题讨论】:

    标签: sql mysql query-optimization union


    【解决方案1】:

    我做了一个测试来证明 MySQL 没有优化这种查询: 首先我执行这个查询:

    select @a1 := 0;
    select @a2 := 0;
    
    (SELECT id, @a1:=@a1+1 FROM companies)
    UNION
    (SELECT id, @a2:=@a2+1 FROM invoices)
    LIMIT 10;
    

    然后我观察@a1 和@a2 变量的值:

    select @a1 as a1, @a2 as a2;
    

    在我的测试中,它们是 a1 = 81 和 a2 = 467。 所以联合查询的单选不受限制。

    【讨论】:

    • 谢谢。很好的方式来说明幕后发生的事情。现在我需要找到一种方法来消除不需要的昂贵查询
    【解决方案2】:

    由于您只希望联合中的 10 行,您可以将LIMIT 10 添加到每个子查询中,这样每个子查询最多返回 10 行。

    【讨论】:

    • Mchl,这确实是一个很好的建议,但它没有回答问题。如果第一个(或第二个)达到限制,是否会排除最昂贵的查询(最后一个最昂贵的)?
    • 感谢您的澄清!但是 Lorenzo 有不同的意见,这使得您限制子查询的建议更有价值! :-)
    • 我相信将每次选择限制在 10 的建议,然后将全局选择限制在 10,这是一个非常好的建议。我也会这样做:)
    • 也许我不清楚。我的观点与洛伦佐的演示相同。
    • +1 以获得好的建议。我接受了洛伦佐的回答,因为它回答了更多问题。谢谢。
    猜你喜欢
    • 2013-10-04
    • 1970-01-01
    • 2012-03-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多