MySQL INSERT ... SELECT ...永远不会结束,CPU最大

时间:2015-11-26 10:16:24

标签: mysql subquery aggregate-functions sql-insert

我需要在保留一个项目的同时从表中删除重复项。由于我在where语句中的子查询中访问同一个表时无法从表中删除,因此我决定将受影响的ID存储在临时表中:

create temporary my_temp_table (
  id int not null
) engine memory;

然后使用select:

插入ID
insert into my_temp_table
  -- select query works
  select
    id
  from
    -- innodb
    table_with_duplicates
  where
    hash_code in (
    select
      hash_code
    from
      table_with_duplicates
    group by
      hash_code
    having
      count(id) > 1
    )
    and date_created < '2015-01-01'
;

稍后我想使用这些ID删除它们:

delete from table_with_duplicates
  where id in (
    select id from my_temp_table
  )
;

只是执行insert语句的select部分工作正常。但是,添加插入部分会导致1个CPU核心达到100%并且查询似乎永远不会结束。什么都没插入。 在我的开发环境中, table_with_duplicates 包含大约20000行,其中1个重复。 有什么想法吗?

修改 谢谢您的回答。我尝试了一种选择不同的(...... )方法,它没有多大帮助。也许我已经在错误的地方使用了/ subselect。已经玩了很多为了澄清,我有这样的事情:

ID    date_created    hash_code
1     2013-06-06      ABCDEFGH     <-- delete this one
2     2013-08-08      HGFEDCBA
3     2015-11-11      ABCDEFGH     <-- keep this one

1 个答案:

答案 0 :(得分:0)

好吧,我选择了不同的方法来解决这个问题。我编写了一个小的PHP命令行脚本,它将我的所有ID读取到一个数组中,然后使用所有ID作为....执行DELETE。

"delete from table_with_duplicates where id in (".explode(',' $arrIDs).")";

有大约9000个受影响的行,并且(希望)是一次性行动,这对我有用。

我也玩过

SET SESSION optimizer_search_depth = 1;

但也没有运气。