四时宝库

程序员的知识宝库

MYSQL存储引擎InnoDB(十五):将表从 MyISAM 转换为 InnoDB(上)

调整 MyISAM 和 InnoDB 的内存使用情况

当您从MyISAM表转换时,降低 key_buffer_size配置选项的值以释放不再需要缓存结果的内存。增加innodb_buffer_pool_size配置选项的值,该选项执行为表分配高速缓存。InnoDB缓冲池缓存表数据和索引数据,加快查询查找速度,并将查询结果保存在内存中以供重用。


处理过长或过短的事务

由于MyISAM表不支持事务,您可能没有过多关注 autocommit配置选项以及COMMIT和ROLLBACK 语句。这些关键字对于允许多个会话同时读取和写入InnoDB表非常重要。可以在写入繁重的工作负载中提供显着的可扩展性优势。

当事务打开时,系统会保留事务开始时所见数据的快照,如果系统在杂散事务继续运行时插入、更新和删除数百万行,这可能会导致大量开销。因此,请注意避免运行时间过长的事务:

1、如果您使用mysql会话进行交互式实验,请务必在完成时COMMIT(完成更改)或 ROLLBACK(撤消更改)。及时关闭交互式会话,而不是让它们长时间打开,以避免意外地让交易长时间打开。

2、确保您的应用程序中的任何错误处理程序 会ROLLBACK 未完成的更改或COMMIT 已完成更改。

3、ROLLBACK是一个相对昂贵的操作,因为 INSERT, UPDATE和 DELETE操作是在COMMIT之前写入InnoDB表的。内核的编写理念是期望大多数更改都成功提交并且很少回滚。在试验大量数据时,避免对大量行进行更改然后回滚这些更改。

4、当使用一系列INSERT语句加载大量数据时 ,请定期COMMIT提交结果以避免持续数小时的事务。在数据仓库的典型加载操作中,如果出现问题,您最好截断表(使用TRUNCATE TABLE)并从头开始,而不是执行 ROLLBACK。


前面的提示可以节省在太长的事务期间可能浪费的内存和磁盘空间。当事务比应有的时间短时,问题是 I/O操作过多。对于每个COMMIT,MySQL 确保所有更改都安全地记录到磁盘。这涉及到一些 I/O操作。

1、对于InnoDB表上的大多数操作,您应该使用autocommit=0设置 。从效率的角度来看,当您发出大量连续的INSERT、 UPDATE或 DELETE语句时,这可以避免不必要的 I/O。从安全角度来看,如果您在mysql命令行或应用程序的异常处理程序中 出错,这允许您发出一条 ROLLBACK 语句来恢复丢失或乱码的数据。

2、当运行一系列查询以生成报告或分析统计信息时,autocommit=1适用于InnoDB表。在这种情况下,没有与 COMMIT或ROLLBACK相关的 I/O 损失并且InnoDB可以自动优化只读工作负载。

3、如果您进行了一系列相关更改,请一次性完成所有更改,在最后执行 COMMIT。例如,如果您将相关的信息片段插入到多个表中,则在进行所有更改后执行一次COMMIT 。或者,如果您运行许多连续的INSERT语句,则在加载所有数据后执行单个COMMIT;如果您正在执行数百万条INSERT语句,则可以通过每万或十万条记录执行一次COMMIT来拆分庞大的事务,这样事务就不会变得太大。

4、请记住,即使是一条SELECT 语句也会打开一个事务,因此在交互式mysql 会话中运行一些报告或调试查询后,发出COMMIT 或关闭mysql会话。

发表评论:

控制面板
您好,欢迎到访网站!
  查看权限
网站分类
最新留言
    友情链接