mysql innodb vs myisam插入

时间:2012-03-16 20:26:07

标签: mysql innodb myisam

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

INSERT IGNORE INTO table1(name) SELECT name FROM main WHERE ID < 500001

InnoDB在大约3分45秒内执行

然而,MyISAM仅在4秒内执行。为什么不同?

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

3 个答案:

答案 0 :(得分:12)

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

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

  

但我的许多表格都不会更新

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

<强> innodb的缓冲池大小

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

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

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

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

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

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

答案 1 :(得分:1)

你在某种程度上说得对。 InnoDB比MyISAM慢,但在哪些情况下呢? 一切都不是为了满足每个人的要求。 INNODB是一个事务性数据库引擎,而MyISAM则不是。因此,为了使其成为ACID合规性和交易感知存储引擎,我们必须在响应时间方面支付其成本。

如果使用my.ini或其他配置文件正确调整InnoDB,运行速度会更快。

最后,我能够理解为什么人们赞扬InnoDB:

  1. 符合ACID和交易支持的引擎
  2. 当MyISAM采用表级锁
  3. 时,它在处理表时采用行级锁定
  4. InnoDB可用于多核/多进程计算机,以提高并发性
  5. 最后但并非最不重要的评论;任何事情都可以满足“每个人”的需求,因此它完全取决于您在比较两个引擎的情况。

答案 2 :(得分:0)

在维基百科上查看MYISAM与Innodb的比较。

http://en.wikipedia.org/wiki/Comparison_of_MySQL_database_engines