MySql 删除需要很长时间

Posted

技术标签:

【中文标题】MySql 删除需要很长时间【英文标题】:MySql Delete Taking A Long Time 【发布时间】:2017-03-08 21:48:18 【问题描述】:

我有一个基于主键删除一组 300 条记录的查询。

该表大约有 250,000 条记录和四列(int PK、varchar、date、tinyint),所以它应该是一个非常易于管理的大小,但是,在没有其他查询运行的情况下删除大约需要 2 分钟,这看起来很漂亮根据删除的行数和表的大小而过度。

sql 如下所示:

-- this takes less than 1 second
CREATE TEMPORARY TABLE IF NOT EXISTS temp AS (
    SELECT id
    FROM some_other_table
    WHERE ...
    LIMIT 300
);  

-- id is the primary key
-- this takes upwards of 2 minutes
DELETE FROM queue WHERE id in(
    select id from temp
);

该表只有一个附加索引,没有外键关系。关于我可以做些什么来加快速度的任何想法?

【问题讨论】:

购买更快的硬盘?使用固态硬盘?你确定你的临时表有主键吗? 很难判断没有访问您的数据库。您是否尝试过查看查询计划? dev.mysql.com/doc/refman/5.7/en/explain-extended.html 试试 EXPLAIN 看看你能不能找到任何东西。此外,您可能想尝试使用 JOIN 而不是 IN 子句。 【参考方案1】:

Mysql不能很好的优化IN,改用JOIN:

DELETE q.* FROM queue q INNER JOIN temp t ON q.id=t.id

【讨论】:

Welp,做到了。花了 0.1 秒。谢谢。 另外,使用where in(select...from table)select 语句可能比对应的delete 运行得更快。

以上是关于MySql 删除需要很长时间的主要内容,如果未能解决你的问题,请参考以下文章

我想减少 MYSQL 查询执行时间。我的查询需要很长时间?

MySQL 查询返回 JSON 数据需要很长时间

在 Oracle 中处理删除逻辑需要很长时间

MySql 查询需要很长时间 PHP

MySQL存储过程执行需要很长时间

MySQL - INSERT 查询需要很长时间