mysql innodb vs myisam插入

nic*_*ick 5 mysql myisam innodb

我有一张1700万行的表.我需要抓取该表的1列并将其全部插入到另一个表中.这是我做的:

INSERT IGNORE INTO table1(name) SELECT name FROM main WHERE ID < 500001
Run Code Online (Sandbox Code Playgroud)

InnoDB大约需要3分45秒

但是,MyISAM仅在4秒内执行.为什么不同?

我看到每个人都赞扬InnoDB但老实说我不知道​​它对我来说有多好.它慢得多.我知道它对于完整性和诸如此类的东西很有用,但我的许多表都不会被更新(只是阅读).我应该打扰InnoDB吗?

Fli*_*McF 12

差异很可能是由于innoDB的配置,比myISAM需要更多的调整.innoDB的想法是将大部分数据保存在内存中,只有在有几个备用cpu周期时才刷新/读取到磁盘.

如果你甚至打扰InnoDB是一个非常好的问题.如果您要继续使用MySQL,强烈建议您获得InnoDB的一些经验.但是如果你为一个不会看到大量流量并且不担心规模的数据库做一个快速而肮脏的工作,那么MyISAM的易用性可能只是你的胜利.在许多人只想要一个简单的数据库的情况下,InnoDB可能会有些过分.

但我的许多表都不会更新

如果您正在进行99%的阅读,您仍然可以从InnoDB获得性能提升.如果您将缓冲池大小配置为将整个数据库保存在内存中,InnoDB将永远不必转到磁盘来获取您的数据,即使它错过了mysql查询缓存.在MyISAM中,您很可能必须从磁盘读取行,并且您将离开操作系统为您执行缓存和优化.

InnoDB的缓冲池大小

我的第一个猜测是检查innodb_buffer_pool_size,它开箱即用,设置为8M.建议大约占总内存的80%.一旦达到该限制,innodb性能将显着下降,因为它需要从缓冲区中清除一些东西以便为新数据腾出空间,这可能很昂贵

autocommit = 0
此外,确保在加载表时关闭自动提交,或者在每个插入时都会发生刷新.您可以在完成后重新打开它,这是客户端设置.非常安全.

加载表通常会发生一次.
想想你是否真的想调整数据库以适应"插入1700万行".你经常这样做吗?在这种情况下,MyISAM可能会更快,但当你有100个并发连接同时读取和修改这个表时,你会发现一个经过良好调整的innoDB会赢,而MyISAM会阻塞表锁.

MyISAM如何看待这个操作
MyISAM在没有任何调整的情况下会非常擅长这一点,因为在封面下,你只需将每一行附加到一个文件(并更新一个索引).您的操作系统和磁盘缓存将处理所有这些性能问题.

InnoDB如何看待这个操作
Innodb将知道该表需要写入,因此它将行抛出到插入缓冲区中.你在下一次插入之前没有时间给它,所以innoDB没有时间处理缓冲区,它耗尽了空间,并且在写入缓冲池并更新索引时被迫"保持"插入.接下来,你的缓冲池填满了,并且innoDB被迫"保持"插入并将一些页面从缓冲池中刷新到磁盘.并且你像疯了一样向它投掷插入物.请注意,当您执行此操作后调整InnoDB以快速为您提供MySQL>提示时,InnoDB仍然会陷入困境,以便赶上它的业余时间,但愿意为您执行新的事务.

必读:
http ://www.mysqlperformanceblog.com/2007/11/01/innodb-performance-optimization-basics/
http://dev.mysql.com/doc/refman/5.0/en/innodb-tuning.html (请参阅批量数据加载提示)