使用DELETE进行MySQL查询,其中ANY运行时间过长

时间:2016-11-15 22:54:23

标签: mysql

这是我的问题:

DELETE FROM my_table WHERE name = ANY (
SELECT name FROM (
    SELECT sd1.name
    FROM my_table sd1 JOIN my_table sd2
    ON sd2.name > sd1.name
    AND sd2.name & sd1.name = sd1.name
    AND sd1.number >= sd2.number) AS stmp
);

name是主键BIGINT类型。

即使my_table中没有那么多行,也需要很长时间才能运行。 关于如何让它运行得更快的任何想法。

2 个答案:

答案 0 :(得分:1)

您正在寻找sd1.names,其中存在具有特定条件的另一条记录。然后删除所有找到名称的记录。

这不是简单的:删除哪些记录存在具有特定条件的另一条记录?

DELETE FROM my_table
WHERE EXISTS
(
  SELECT *
  FROM
  (
    SELECT *
    FROM my_table sd2
    WHERE sd2.name > my_table.name
    AND sd2.name & my_table.name = my_table.name
    AND my_table.number >= sd2.number
  ) dummy
);

更新: MySQL无法访问UPDATEDELETE中的同一个表,并且必须包装子查询,以便表格隐藏一层隐藏的更深层次。绝对没有意义,但应该解决这个问题。希望它能。)

那不那么复杂,因此可能更快。特别是因为EXISTS必须在每个主记录中只找到一个匹配并且可以在那里停止,而联接则查找所有匹配。

答案 1 :(得分:0)

显然你可以用INNER JOIN http://www.mysqltutorial.org/mysql-delete-join/削减DELETE 如果JOIN很大,它仍然需要一段时间。