在巨大的表中,MySQL INSERT语句是否更慢?

时间:2010-07-06 09:06:10

标签: mysql optimization

我可以看到SELECTUPDATE语句随着表的增长和增长而变慢,但INSERT呢?

6 个答案:

答案 0 :(得分:5)

INSERT也会变慢,特别是如果你有很多索引也需要更新。

不同的存储引擎之间存在差异:MyISAM对于大量SELECT而言更快,InnoDB对于很多INSERT / UPDATE来说更快,因为它使用行锁定而不是表锁定及其处理索引的方式。

答案 1 :(得分:3)

INSERT也变慢了,因为它必须整理索引。

答案 2 :(得分:3)

你可以看看这篇文章:

speed insert

答案 3 :(得分:3)

一般情况下,是的 - O(1)性能在任何地方都很少见,并且保持索引最新是有成本的。

问题是,为什么这很重要,在特定情况下你能做些什么呢?

  • 不创建从未使用的索引(例如,我一直在主键上查找带有额外单列索引的表)
  • 不要在表中保留无用的数据(或者,如果您很少使用旧数据,请考虑将它们移动到存档表/数据库)
  • 如果您在插入速度方面遇到问题并且您不关心自动增量ID,INSERT DELAYED可能会帮助您

答案 4 :(得分:1)

INSERT也变慢了

答案 5 :(得分:-1)

如果你的桌子很小,你就可以了。但是如果你的表变得越来越大,插入,更新会变慢,这是我使用的程序并且适用于我。

即使使用InnoDB表或MyISAM(未针对写入进行优化),也会发生此问题,并通过使用第二个表来写入临时数据(可以定期更新主巨型表)来解决此问题。主表超过1800万条记录,用于只读取记录并将结果写入第二个小表。

问题是插入/更新到大型主表,需要一段时间,如果队列中有多个更新或插入等待,即使启用了INSERT DELAYED或UPDATE [LOW_PRIORITY]选项,也会更糟糕

为了使速度更快,首先要读取小型辅助表,在搜索记录时,如果有记录,则只在第二个表上工作。使用主大表作为参考并仅获取新数据记录*如果数据不在辅助小表上,您只需从主服务器读取记录(在InnoDB表或MyISAM方案上快速读取)然后插入记录在小秒表上。

像魅力一样工作,需要花费不到5秒的时间从巨大的硕士记录中读取2000万条记录,并在不到一秒的时间内写入第二张小表100K至300K记录。

这很好用。