MyISAM用于数据读取


10

我有一个约有10亿行的表,其98%的读密集型。

我尝试使用不同的存储引擎(MyISAM和InnoDB)调整数据库

然后进行一些测试以查看性能

在where子句中,我有一个主键ID,而且由于MyISAM Ke​​y Cache存储将所有索引加载到其缓冲区中,因此使用MyISAM似乎非常快,比InnoDB快2倍。

但是对于InnoDB来说,它似乎更慢!InnoDB是否不使用任何缓冲区预加载索引?


也许有任何触发开心的主持人投票结束这个问题,可以阐明他们的动机吗?
pQd

您能否给我们一些有关数据库和表的大小的想法?磁盘上的总大小将很有用。另外,您正在运行的机器是什么规格?
戴夫·里克斯

Answers:


6

在决定MyISAM或InnoDB之前,您必须根据每个缓存的存储方式来检查两个存储引擎。

我的ISAM

读取时,可以从.MYI文件读取一次MyISAM表的索引,并将其加载到MyISAM密钥缓存中(由key_buffer_size调整大小)。如何使MyISAM表的.MYD读起来更快?有了这个:

ALTER TABLE mytable ROW_FORMAT=Fixed;

我在过去的帖子中写了这个

创新数据库

好吧,InnoDB呢?InnoDB是否进行任何磁盘I / O查询?令人惊讶的是,是的!您可能以为我这么说很疯狂,但这是绝对正确的,即使对于SELECT查询也是如此。在这一点上,您可能想知道“ InnoDB在世界上如何进行磁盘I / O查询?”

这一切都可以回溯到InnoDB,它是一个具有ACID投诉事务存储引擎。为了使InnoDB具有事务性,它必须支持Iin ACID,即隔离。维护事务隔离的技术是通过MVCC(Multiversion并发控制)完成的。简单来说,InnoDB会在事务尝试更改数据之前记录其数据。在哪里记录?在系统表空间文件中,更好地称为ibdata1。这需要磁盘I / O

比较

既然InnoDB和MyISAM都执行磁盘I / O,那么哪些随机因素决定了谁更快?

  • 列大小
  • 列格式
  • 字符集
  • 数值范围(需要足够大的INT)
  • 行跨块拆分(行链接)
  • DELETEs和引起的数据碎片UPDATEs
  • 主键的大小(InnoDB具有聚集索引,需要两次键查找)
  • 索引条目的大小
  • 清单继续...

结语

因此,在繁重的读取环境中,如果有足够的数据被写入ibdata1中包含的撤消日志中以支持事务行为,则具有固定行格式的MyISAM表可能胜过InnoDB从InnoDB缓冲池中读出的数据施加在InnoDB数据上。仔细计划您的数据类型,查询和存储引擎。数据增长后,移动数据可能会变得非常困难。

顺便说一句,我在5天前写了这样的内容:如何为mySQL分配内存限制?


当所有数据都已经在缓冲池中并且没有并发数据修改请求时,innodbe真的会产生任何磁盘读取吗?
2012年

我的猜测是,询问者的数据库中有10亿行,那么他不太可能将其全部缓存在缓冲池的RAM中-因此是否需要读取才能到达缓冲池外部和磁盘上的数据?
戴夫·里克斯

3

没有数据争用时,MyISAM的运行速度总是比innodb快得多。开始添加多个会话以尝试更新同一表,innodb很快就会获得性能优势。

您为2个引擎调整系统的方式非常不同。

存在不同引擎的原因是因为存在不同的工作负载/访问模式。


2

您必须“热身” innodb。例如,通过重播访问日志或运行一些智能查询,这些查询将触及索引中的每个值。

看看这里这里

我希望您不要对innodb使用默认的mysql设置-它们适用于〜2000以后的硬件。


我确实对默认配置进行了更改,还多次运行了查询(大约30次),但结果几乎相同。经过几次尝试后速度更快,但仍比MYISAM慢,也使用了MariaDB(最新版本)
Akash


0

在MariaDB上进一步调整InnoDB之后,我将innodb_buffer_pool_sizeInnoDB数据库的大小增加了,因为这样做,InnoDB开始更快地获取行。

我想根据您的数据库需求调整InnoDB非常重要

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.