1

使用 MariaDB 10.4.12,我正在尝试执行一个基于子查询的 DELETE 语句:

DELETE FROM `mydb1`.`mytable1` 
WHERE `my_id` IN (
    SELECT `TABLE_ID` FROM `TABLES_CT` 
    WHERE `TABLE_NAME` = 'tableName'AND `TABLE_ACTION` IN ('D', 'U')
);

当我执行此操作时,它会在 30 秒后超时。如果我查看 information_schema.innodb_lockwaits 和 innodb_trx,相同的 DELETE 语句会在两个不同的线程上阻塞自身。

如果我将它作为 SELECT 运行,它会在 1 毫秒内执行。

有任何想法吗?

4

1 回答 1

2

MySQL 往往优化WHERE IN不佳。使用等效的 JOIN intead。

DELETE t1 FROM mydb1.mytable1 AS t1
JOIN TABLES_CT AS t2 ON t1.my_id = t2.TABLE_ID
WHERE t2.TABLE_NAME = 'tableName' AND t2.TABLE_ACTION IN ('D', 'U')
于 2020-05-20T20:36:38.033 回答