【问题标题】:How to make sub delete queries faster?如何使子删除查询更快?
【发布时间】:2013-12-08 23:01:53
【问题描述】:

我想问一个关于使 mysql 子查询更快的问题。这个查询运行良好,但是当我输入该查询时它几乎运行了 2.50 小时:

delete from callspan where oid not in (select * from (select MIN(oid) from callspan b Group by b.endtime, b.starttime, b.person_oid,b.phonenumber_oid,b.contact,b.description,b.direction,b.duration) x);

如何才能更快地运行此代码?另外,我尝试使用 JOIN 来实现,但我没有这样做。麻省理工学院的调用数据集中的数据太多,我正在使用该数据集进行训练。对于这些类型的查询,您有任何解决方案吗?

谢谢,亲切的问候。

【问题讨论】:

  • 听起来您需要重新评估索引策略。
  • 在查询前加上解释,然后发布结果。在我看来,虽然 callpan 是非常不规范的。
  • 解释不适用于所有查询,但是当我在选择查询之前编写它时,它的工作。如果你愿意,我可以发送输出数据。

标签: mysql sql dataset subquery sql-delete


【解决方案1】:
delete c
  from callspan c
  LEFT
  JOIN 
     ( select MIN(oid) min_oid
         from callspan b 
        Group 
           by b.endtime
            , b.starttime
            , b.person_oid
            , b.phonenumber_oid
            , b.contact
            , b.description
            , b.direction
            , b.duration
      ) x
     ON x.min_oid = c.oid
  WHERE x.min_oid IS NULL;

http://sqlfiddle.com/#!2/dd028/1

或者,您可以颠倒逻辑 - 创建一个仅包含所需行的新表,然后删除旧表并使用新数据重新创建它,然后将索引重新添加到该表上 - 这可能会更快...

CREATE TABLE new_callspan AS
SELECT x.*
  FROM callspan x 
  JOIN 
     ( SELECT person_oid
            , MIN(oid) min_oid
         FROM callspan
        GROUP
           BY person_oid
     ) y
    ON y.person_oid = x.person_oid
   AND y.min_oid = x.oid;

 DROP TABLE callspan;

 CREATE TABLE callspan AS SELECT * FROM new_callspan;

 DROP TABLE new_callspan;

 ALTER TABLE etc  

【讨论】:

  • 此查询的运行时间与我自己的查询相似。我怎样才能更快地工作?
  • 还有 60 分钟,查询还没有结束。有什么办法可以解决这个慢的问题吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-02-16
  • 2012-07-24
  • 2019-11-18
  • 2010-11-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多