用于数据读取的MyISAM

我有一张大约10亿行的桌子,其中98%的阅读密集。

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

然后跑了几次testing来查看性能

在where子句中,我有一个主键ID,看起来,由于MyISAM Ke​​y Cache存储将所有索引加载到缓冲区中,使用MyISAM似乎非常快,比InnoDB快大约2倍

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

在决定使用MyISAM或InnoDB之前,您必须查看每个存储引擎的caching方式

MyISAM数据

读取时,可以从.MYI文件读取一次MyISAM表的索引,并将其加载到MyISAM密钥caching中(由key_buffer_sizeresize)。 你怎么能使MyISAM表的.MYD更快地阅读? 有了这个:

ALTER TABLE mytable ROW_FORMAT=Fixed; 

我在过去的文章中写过这个

  • Sep 20, 2011 : https : //dba.stackexchange.com/questions/5974/best-of-myisam-and-innodb/6008#6008 (请先阅读本文)
  • May 10, 2011 : https : //dba.stackexchange.com/questions/2640/what-is-the-performance-impact-of-using-char-vs-varchar-on-a-fixed-size-field/2643 #2643 (tradeofff#2)
  • Aug 12, 2011 : https : //dba.stackexchange.com/questions/4576/which-dbms-is-good-for-super-fast-reads-and-a-simple-data-structure/4589#4589 (段落3)
  • Jan 03, 2012 : https : //dba.stackexchange.com/questions/10069/optimized-my-cnf-for-high-end-and-busy-server/10080#10080 (在复制标题下)

InnoDB的

好的,InnoDB呢? InnoDB是否为查询执行任何磁盘I / O操作? 令人惊讶的是,它确实! 你可能认为我疯了,但这绝对是真的, 即使对于SELECT查询 。 在这一点上,您可能想知道“InnoDB如何在查询时使用磁盘I / O?

这一切都可以追溯到InnoDB是一个ACID -complaint交易存储引擎。 为了让InnoDB成为事务性的,它必须支持ACID ,这就是Isolation。 保持事务隔离的技术是通过MVCC和Multiversion并发控制完成的 。 简而言之,InnoDB会logging事务尝试更改之前的数据。 哪里得到logging? 在系统表空间文件中,更好地称为ibdata1。 这需要磁盘I / O。

对比

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

  • 列的大小
  • 列格式
  • 字符集
  • 数值范围(需要足够大的INT)
  • 行被拆分(块链)
  • DELETEsUPDATEs引起的数据碎片
  • 主键大小(InnoDB有一个聚集索引,需要两个键查找)
  • 索引条目的大小
  • 名单继续…

结语

因此,在一个繁重的环境中,如果有足够的数据被写入ibdata1中所包含的撤消日志以支持事务性行为,那么具有固定行格式的MyISAM表就可能胜过InnoDB读出InnoDB缓冲池强加在InnoDB数据上。 仔细规划您的数据types,查询和存储引擎。 一旦数据增长,移动数据可能变得非常困难。

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

没有数据争用的情况下,MyISAM总是比innodb运行得更快。 开始添加多个会话来尝试更新同一个tablse,innodb很快就会获得性能优势。

如何调整2个引擎的系统是非常不同的。

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

你必须“热身”innodb。 例如通过重新播放访问日志或运行一些智能查询来触摸索引中的每个值。

看看这里或这里 。

我希望你不要使用默认的MySQL设置innodb – 他们适合从〜2000的硬件。

检查这个网站,它有非常有用的信息:

http://www.mysqlperformanceblog.com/2007/11/01/innodb-performance-optimization-basics/

http://www.mysqlperformanceblog.com/2007/11/03/choosing-innodb_buffer_pool_size/

你也可以调整你的文件系统。 我在XFS上获得了优秀的Sunit和Swidth值 (当然,如果使用RAID)

在MariaDB上进一步调整InnoDB之后,我将innodb_buffer_pool_size增加到了InnoDB数据库的大小,因为InnoDB已经开始更快地获取行了

我想根据你的数据库需要调整InnoDB是相当重要的