2016-11-15 118 views
1

这里是我的查询:MySQL查询与DELETE任何地方运行时间过长

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 
); 

名是主键BIGINT类型。

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

+0

你使用什么数据类型作为'name'? –

+0

另外我忘了提及这个名字是my_table的主键 – Pol99

+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必须为每个主要记录找到一个匹配项,并且可以在那里停止,而连接查找所有匹配项。

+0

嗯,它给了我语法错误: 的MySQL> DELETE FROM MY_TABLE SD1 WHERE EXISTS ( SELECT * FROM SD2 MY_TABLE WHERE sd2.name> sd1.name AND sd2.name&sd1.name = sd1.name AND sd1.number> = SD2。号码 ); 错误1064(42000):您的SQL语法错误;检查 对应于你的MySQL服务器版本 'SD1 WHERE EXISTS ( SELECT * FROM SD2 MY_TABLE WHERE sd2.name> sd1.name ' 在行1 – Pol99

+0

我不得不用接近正确的语法手册谷歌这个。MySQL不接受任何原因的表别名(他们提供了别名的奇怪的语法,但我们可以轻松地在这里没有。)请看我更新的答案。 –

+0

我一直使用MySQL别名。当我按照您的建议运行查询时出现以下错误信息: 错误1093(HY000):您无法在FROM子句 – Pol99