1

我有一个表,由多个工作应用程序访问,这些应用程序获取一批记录,在它们上计算一些东西并将计算结果更新回这个表。该表目前是基于 MyISAM 的,但由于我们对计算算法进行了一些更改并导致了巨大的加速,我们已经看到表上的锁负载,这是预期的,因为它是一个 MyISAM 表。(该表中有大约650-700 000条记录)。

处理完所有记录后,会根据它生成报告并截断表格。一旦表被截断,一个进程会重新初始化它并重新开始循环。

我正在考虑将 MyISAM 表切换到 InnoDB 以防止锁定,但是INSERT INTO .. SELECT .. FROM当我决定停止时,使用语句初始化表的进程(过去需要 3-4 分钟)运行了 35-40 分钟. 为什么是这样?有没有办法加快速度?

4

1 回答 1

1

MyISAM 按照插入的顺序存储记录。另一方面,InnoDB 的主键是聚集索引,因此记录的物理存储顺序与主键相同。因此,请确保您按主键顺序插入。您可以将 ORDER BY 子句添加到 INSERT INTO ... SELECT。

此外,为避免拆分页面和重建二级索引,请在插入初始行后添加二级索引。因此,删除索引,然后重新添加它们。

此外,为避免行锁定(和自动增量锁定)开销,请使用 LOCK TABLES 显式锁定表。

最后,增加innodb_buffer_pool_size,否则你的索引会建立得很慢。默认只有 8MB。

于 2012-07-12T12:39:02.103 回答