删除大表中的记录时MySQL很慢

标签 mysql database performance

我有一个这样的查询需要很长时间才能运行。该表大约有 400 万行。

DELETE FROM TABLE WHERE value_was IS NULL OR value_was <= value_now;

我希望我可以为 (value_was, value_now) 创建一个索引,这样我就可以做类似的事情

DELETE FROM TABLE WHERE 
ID1 IN (SELECT ID1 from TABLE where value_was IS NULL) 
OR ID2 IN (SELECT ID2 FROM TABLE WHERE value_was <= value_now);

这个表没有主键。它有两个复合键。而且我想我不能在子查询中使用同一个表,但是如何提高第一个查询的性能?

非常感谢任何建议将不胜感激。

更新: 数据库是innoDB

最佳答案

由于数据的存储方式,作为一个内部链表,innoDB 表在巨大的 DELETE 操作中天生就很慢。将存储类型更改为 myISAM 应该会使操作快得多 - 我在类似情况下看到了 100 倍的改进。

关于删除大表中的记录时MySQL很慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16554988/

相关文章:

PHP 数据库写入性能 PDO VS ORM

mysql - 按 child 和姓名选择语句顺序

performance - 如何让我的 Rust 函数更通用和高效?

android - 用于通过单跳 Wi-Fi 网络从 Android 设备上传大型二进制文件 (50-200 MB) 的 HTTP 与 Vanilla 套接字

php - MySQL 数据库的默认字段值

mysql - 从服务器创建mysql备份,使用scp下载到本地并替换mamp数据库

Java - 将数组存储到内存或从内存上传到磁盘

MySql SELECT 通过拆分由 || 分隔的多个值

java - 为什么检查 HashMap 是否具有特定值需要很长时间才能在 for 循环中执行?

java - 错误 405 : Method not Allowed on DELETE and PUT