当有少量索引时,为什么MySQL InnoDB在大型表上插入/更新会变得非常慢?

Gre*_*reg 19 mysql indexing performance

我们有一系列有机增长到数百万行的表,在生产中进行插入或更新可能需要长达两秒钟.但是,如果我转储表并从转储查询重新创建它是快速的.

我们通过创建一个副本来重建其中一个表,重建索引然后执行重命名切换并复制任何新行,这是因为该表只被附加到.这样做可以快速插入和更新闪存.

我的问题:

为什么插入会随着时间的推移变慢?为什么重新创建表并进行导入修复?有没有办法可以重建索引而不锁定表更新?

Bre*_*ley 10

InnoDB性能严重依赖于RAM.如果索引不适合RAM,性能可能会大幅下降.重建整个表可以提高性能,因为数据和索引现在已经过优化.

如果您只是插入表中,MyISAM更适合这种情况.如果仅追加,则不会出现锁定问题,因为记录已添加到文件末尾.MyISAM还允许您使用MERGE表,这些表非常适合脱机或归档部分数据而无需进行导出和/或删除.

  • InnoDB 如何[使用内存](http://dev.mysql.com/doc/refman/5.5/en/innodb-buffer-pool.html)的详细信息。请注意,InnoDB 从 5.0 到 5.1、5.5 及更高版本有了很大的改进。 (2认同)

ggi*_*oux 9

这听起来像是

  • 索引不平衡随着时间的推移
  • 磁盘碎片
  • 内部innodb数据文件碎片

您可以尝试analyze table foo哪些不带锁,只需几次索引潜水并需要几秒钟.

如果这不能解决问题,您可以使用

mysql> SET PROFILING=1;
mysql> INSERT INTO foo ($testdata);
mysql> show profile for QUERY 1;
Run Code Online (Sandbox Code Playgroud)

你应该看到大部分时间花在哪里.

显然,当以PK命令完成插入时,innodb表现更好,这是你的情况吗?