2012-03-16 121 views
5

我有一张1700万行的表格。我需要抓取该表的1列并将其全部插入到另一个表中。下面是我所做的:mysql innodb vs myisam inserts

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

InnoDB的执行大约3分45秒

然而,在MyISAM数据略低于4秒执行。为什么区别?

我看到每个人都赞美InnoDB,但老实说,我不明白它对我来说有多好。速度非常慢。我明白这对于完整性和非常好,但我的许多表格不会更新(只是阅读)。我应该甚至打扰InnoDB?

+0

我只使用InnoDB时,我与关系表的工作。否则,如果你没有任何外键,我更喜欢MyISAM! – 2012-03-16 20:28:05

+0

只是要指出,这两个表上都有一个索引。 “主”表目前是myisam。 – nick 2012-03-16 20:28:11

+0

本,我想使用关系表,但我会处理可能数以百万计的行 - 我需要索引数十列,所以我不知道要去哪个方向。诚信不是什么大问题。至少不是这部分。 – nick 2012-03-16 20:29:49

回答

12

这个差异很可能是由于innoDB的配置,它比myISAM稍微调整一些。 innoDB的想法是将大部分数据保存在内存中,并且只有在有少量备用cpu周期时才清空/读入磁盘。

你应该甚至会打扰InnoDB是一个非常好的问题。如果您要继续使用MySQL,强烈建议您使用InnoDB获得一些经验。但是,如果你为一个数据库做一个快速又脏兮兮的工作,而这个数据库不会看到很多流量,也不会担心扩展,那么MyISAM的轻松可能只是一个胜利。 InnoDB在许多情况下只是想要一个简单的数据库就可以矫枉过正。

但是很多我的表不会被更新

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

InnoDB的缓冲池大小

我的第一个猜测是检查innodb_buffer_pool_size运出来设置为8M盒子。建议占用内存总量的80%左右。一旦你打的限制,因为它需要冲洗出来的东西缓冲区以腾出空间给新的数据,这可能是昂贵的

自动提交= 0
此外,还要确保自动提交是InnoDB的性能将显著下降当你加载你的桌子时关闭,或每次插入都会发生潮红。你可以在完成后重新打开它,这是一个客户端设置。非常安全。

载物台通常发生一次
想想,如果你真的想调整数据库,以适应“插入1,700行”。你多久做一次?在这种情况下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(见批量数据加载提示)

+0

欢迎任何MySQL性能专家(特别是来自Percona)在我错误或遗漏任何内容的情况下纠正我。我会更新答案。 – FlipMcF 2012-03-16 21:28:41

+0

“在innodb-buffer-pool-size上遇到限制”有点不准确。刷新实际上与点击“innodb_max_dirty_pages_pct”有关。但我想,这就是这个问题的头发。 – FlipMcF 2012-03-16 21:37:36

+0

同样很适合你阅读:http://www.mysqlperformanceblog.com/2007/05/24/predicting-how-long-data-load-would-take/ – FlipMcF 2012-03-19 14:54:37

1

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

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

在我能够理解下面的人为什么都大赞InnoDB的原因到底:

  1. 这是ACID兼容和交易支持的引擎
  2. 它以行级锁在桌子上,而MyISAM的工作时取表级锁
  3. InnoDB的是高度可调的多核/多进程的机器,以提高并发

最后但并非最不评论我侧;任何事情都可以满足“每个人的”需求,所以它完全取决于你在比较两种引擎的情况。