【问题标题】:Limit when using UNION ALL and LEFT JOINs使用 UNION ALL 和 LEFT JOIN 时的限制
【发布时间】:2018-10-19 16:49:24
【问题描述】:

显然,当使用 UNION 或 UNION ALL 时,性能会受到影响。当我不使用 UNION 或 UNION ALL 时,我的页面加载速度提高了 5-10 倍。我想在查询中添加一个 LIMIT 以帮助解决性能问题。

问题是当我添加 LIMIT 5 时,我只从第一个 SELECT 中获得 5 条记录。每个 SELECT 都需要 5 条记录。所以我总共应该有 15 条记录。

这是一个例子:http://sqlfiddle.com/#!9/3617ee/6

【问题讨论】:

  • 限制对结果的工作..您选择每个子查询中的所有行..

标签: php mysql


【解决方案1】:

要对UNION 中的单个选择查询使用限制,请将它们括在括号中。来自Union 文档:

要将 ORDER BY 或 LIMIT 应用于单个 SELECT,请放置子句 在括住 SELECT 的括号内

还有一个有趣的点:

但是,对单个 SELECT 语句使用 ORDER BY 意味着 与行在最终结果中出现的顺序无关 因为默认情况下 UNION 会产生一组无序的行。所以, 在这种情况下使用 ORDER BY 通常与 LIMIT,以便用于确定所选行的子集 检索 SELECT,即使它不一定会影响 这些行在最终 UNION 结果中的顺序。 如果出现 ORDER BY 在 SELECT 中没有 LIMIT,它会被优化掉,因为它会有 反正没有效果。

Updated SQL Fiddle

(
SELECT 

openservicecalls.serial,
openservicecalls.company,

product1_errors.serial,
product1_errors.error,

description.error,
description.description,

masterlist.serial,
masterlist.phonenumber

FROM product1_errors
LEFT JOIN description
ON product1_errors.error = description.error
LEFT JOIN openservicecalls
ON product1_errors.serial = openservicecalls.serial
LEFT JOIN masterlist
ON product1_errors.serial = masterlist.serial LIMIT 5
)

UNION ALL

(
SELECT 

openservicecalls.serial,
openservicecalls.company,

product2_errors.serial,
product2_errors.error,

description.error,
description.description,

masterlist.serial,
masterlist.phonenumber

FROM product2_errors
LEFT JOIN description
ON product2_errors.error = description.error
LEFT JOIN openservicecalls
ON product2_errors.serial = openservicecalls.serial
LEFT JOIN masterlist
ON product2_errors.serial = masterlist.serial LIMIT 5
)

UNION ALL

(
 SELECT 

openservicecalls.serial,
openservicecalls.company,

product3_errors.serial,
product3_errors.error,

description.error,
description.description,

masterlist.serial,
masterlist.phonenumber

FROM product3_errors
LEFT JOIN description
ON product3_errors.error = description.error
LEFT JOIN openservicecalls
ON product3_errors.serial = openservicecalls.serial
LEFT JOIN masterlist
ON product3_errors.serial = masterlist.serial  LIMIT 5
)

【讨论】:

    【解决方案2】:

    您需要将LIMIT 添加到每个SELECT 语句并将所有查询包装在括号中

    (SELECT *
    FROM table1
    LIMIT 5)
    
    UNION ALL
    (SELECT *
    FROM table2
    LIMIT 5)
    
    UNION ALL
    (SELECT *
    FROM table3
    LIMIT 5)
    

    【讨论】:

      猜你喜欢
      • 2018-12-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-02-27
      • 2018-02-28
      相关资源
      最近更新 更多