在MYSQL中插入新列需要太长时间

时间:2011-09-18 11:11:52

标签: mysql

我们有一个庞大的数据库,插入新专栏需要太长时间。无论如何要加快速度?

4 个答案:

答案 0 :(得分:6)

不幸的是,你可能做的不多。插入新列时,MySQL会复制表并在那里插入新数据。 可能会更快地找到它

CREATE TABLE new_table LIKE old_table;
ALTER TABLE new_table ADD COLUMN (column definition);
INSERT INTO new_table(old columns) SELECT * FROM old_table;
RENAME table old_table TO tmp, new_table TO old_table;
DROP TABLE tmp;

这不是我的经历,但我听说其他人都取得了成功。您还可以尝试在插入之前禁用new_table上的索引,然后重新启用。请注意,在这种情况下,您需要注意不要丢失在转换过程中可能插入old_table的任何数据。

或者,如果您的关注在更改期间影响用户,请查看pt-online-schema-change,这样可以巧妙地使用触发器来执行ALTER TABLE语句,同时保持表的修改可用。 (请注意,这不会加快过程。)

答案 1 :(得分:3)

您可以采取四项主要措施来加快速度:

  1. 如果使用innodb_file_per_table,原始表可能在文件系统中高度碎片化,因此您可以先尝试对其进行碎片整理。

  2. 使缓冲池尽可能合理,因此更多的数据,尤其是二级索引,都适合它。

  3. 使innodb_io_capacity足够高,可能比平常更高,以便更快地发生插入缓冲区合并和刷新修改后的页面。需要带有InnoDB插件的MySQL 5.1或5.5及更高版本。

  4. 带有InnoDB插件的MySQL 5.1和MySQL 5.5及更高版本支持快速更改表。其中一个更快的事情是添加或重建既不唯一又不在外键中的索引。所以你可以这样做:

  5. 一个。 ALTER TABLE添加列,DROP非FK中的非唯一索引。

    B中。 ALTER TABLE添加非唯一的非FK索引。

    这应该提供以下好处:

    一个。在步骤A中较少使用缓冲池,因为缓冲池只需要保存一些索引,即唯一的索引或FK中的索引。索引在此步骤中随机更新,因此如果它们不完全适合缓冲池,则性能会变差。因此,重建的机会更快。

    湾快速alter table通过对条目进行排序然后构建索引来重建索引。这样更快,并且还会生成具有更高页面填充因子的索引,因此它开始时会更小更快。

    主要缺点是这有两个步骤,在第一个步骤之后,您将没有一些可能需要良好性能的索引。如果这是一个问题,你可以尝试复制到新的表方法,首先只使用唯一的和FK索引为新表,然后在以后添加非唯一的。

    仅在MySQL 5.6中,但http://bugs.mysql.com/bug.php?id=59214中的功能请求会增加将插入缓冲区更改刷新到磁盘的速度,并限制它在缓冲池中可以占用的空间。这可能是大型工作的性能限制。插入缓冲区用于缓存对二级索引页面的更改。

    我们知道有时这仍然令人沮丧地缓慢,并且非常需要一个真正的在线转换表

    这是我个人的意见。有关Oracle的官方观点,请联系Oracle公关人员。

    James Day,MySQL高级首席支持工程师,Oracle

答案 2 :(得分:1)

通常新行插入意味着有很多索引..所以我建议重新考虑索引。

答案 3 :(得分:0)

迈克尔的解决方案可能会加快速度,但也许你应该看一下数据库并尝试将大表分解成较小的表。看看这个:link。规范化数据库表可能会在将来节省大量时间。