【问题标题】:MySQL is slow when delete records in large tableMySQL在删除大表中的记录时很慢
【发布时间】:2013-05-15 00:41:07
【问题描述】:

我有一个这样的查询需要很长时间才能运行。该表大约有 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

【问题讨论】:

  • 表是存储在myISAM还是innoDB存储引擎中?
  • 这是innoDB。我也更新了问题。

标签: mysql database performance


【解决方案1】:

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

【讨论】:

  • 感谢您的回答。但由于它是一个遗留系统,我无法更改引擎。无论如何我可以改进innoDB中的查询吗?
  • 这里bytes.com/topic/mysql/answers/…一个人建议增加key_buffer_size
  • 这篇文章mysql.rjweb.org/doc.php/deletebig 提供了更深入的信息,但我不知道它的年龄... HTH,无论如何 :)
  • @toy 如果您可以执行查询,您应该也可以更改引擎。在 phpMyAdmin 中单击 3 次,或者手动执行几个命令。
  • @MarcelloRomani 那篇文章是相当新的,它提到了 MySQL 5.1。无论如何,这两篇文章都证实了 innoDB 在大删除时固有的迟缓。除了购买更快的服务器或切换到 myISAM 之外,您对此无能为力 - 所有其他修复都可以将速度提高 200% 或 300%,但没有什么出色的。
猜你喜欢
  • 1970-01-01
  • 2021-07-20
  • 2014-01-09
  • 2013-05-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-04
相关资源
最近更新 更多