【问题标题】:mySQL select union query with repeated subqueries works slow具有重复子查询的 mySQL 选择联合查询工作缓慢
【发布时间】:2019-10-27 16:07:37
【问题描述】:

我有一个简单的表,其中包含由 ID、代码(200 000 条记录)索引的价格表(ID - 价格表、商品代码、商品价格) - 起初我使用“LEFT JOIN”但是它工作得很慢,然后我把它变成这样:

SELECT CODE,price FROM PRICELISTS
WHERE ID=1 AND CODE NOT IN (SELECT CODE FROM PRICELISTS WHERE ID=5)
union 
SELECT CODE,price FROM PRICELISTS WHERE id=5

IT 运行速度更快,但还不够。有什么方法可以简化代码以使其更快?

【问题讨论】:

  • 不太确定您的目标是什么,您能否提供一个小样本数据集以及您想要的结果是什么?

标签: mysql select subquery union


【解决方案1】:

您使用 UNION 的查询等效于:

SELECT CODE,price FROM PRICELISTS
WHERE 
  (ID=1 AND CODE NOT IN (SELECT CODE FROM PRICELISTS WHERE ID=5))
  OR
  (id=5)

我认为这更有效。
但如果您想使用 UNION 删除重复项:

SELECT DISTINCT CODE,price FROM PRICELISTS
WHERE 
  (ID=1 AND CODE NOT IN (SELECT CODE FROM PRICELISTS WHERE ID=5))
  OR
  (id=5)

【讨论】:

  • 是的,我需要删除一个重复项。当存在具有相同代码且 ID=5 的行时,我需要删除 ID=1 的价格行。
  • 如果 id 不同,则行不同,因此您不需要区分。我假设您使用 UNION 的查询返回了预期的结果,不是吗?
  • 你的 SQL 比我的运行得快一点。非常感谢。
【解决方案2】:

尽量避免使用 not in 并使用左连接来处理不匹配的值

    SELECT p.CODE, p.price 
    FROM PRICELISTS p
    LEFT JOIN  (
        SELECT CODE 
        FROM PRICELISTS 
        WHERE ID=5
    ) t1 on t1.code  = p.code 
    where p.id =1 
    and t1.code is null
    union 
    SELECT CODE,price 
    FROM PRICELISTS WHERE id=5

确保您在列的表价格表上有一个 cmposite 索引

 id, code, price

【讨论】:

  • 感谢您的快速回复。字段代码是必填字段,因此其中没有空值。当放置“LEFT JOIN”时,代码执行缓慢。我需要更快地打开查询。
  • 这意味着所有 id = 5 的返回码都与 id = 1 的码相匹配 ... 你没有 NOT IN ...f 的结果
  • 为了更快的查询,您应该避免使用 IN 和 NOT IN 子句..并使用不匹配的 INNER JOIN 和 LEFT JOIN .. 但总体而言,您需要适当的高效索引
  • 使用左连接时大约需要 3 秒。打开查询 - 上面检查 SQL - 不到 1 秒。 - 速度对我很重要。
  • 索引也加快了。谢谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-02
  • 1970-01-01
相关资源
最近更新 更多