我有一个约有10亿行的表,其98%的读密集型。
我尝试使用不同的存储引擎(MyISAM和InnoDB)调整数据库
然后进行一些测试以查看性能
在where子句中,我有一个主键ID,而且由于MyISAM Key Cache存储将所有索引加载到其缓冲区中,因此使用MyISAM似乎非常快,比InnoDB快2倍。
但是对于InnoDB来说,它似乎更慢!InnoDB是否不使用任何缓冲区预加载索引?
我有一个约有10亿行的表,其98%的读密集型。
我尝试使用不同的存储引擎(MyISAM和InnoDB)调整数据库
然后进行一些测试以查看性能
在where子句中,我有一个主键ID,而且由于MyISAM Key Cache存储将所有索引加载到其缓冲区中,因此使用MyISAM似乎非常快,比InnoDB快2倍。
但是对于InnoDB来说,它似乎更慢!InnoDB是否不使用任何缓冲区预加载索引?
Answers:
在决定MyISAM或InnoDB之前,您必须根据每个缓存的存储方式来检查两个存储引擎。
读取时,可以从.MYI文件读取一次MyISAM表的索引,并将其加载到MyISAM密钥缓存中(由key_buffer_size调整大小)。如何使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(TRADEOFF #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是否进行任何磁盘I / O查询?令人惊讶的是,是的!您可能以为我这么说很疯狂,但这是绝对正确的,即使对于SELECT查询也是如此。在这一点上,您可能想知道“ InnoDB在世界上如何进行磁盘I / O查询?”
这一切都可以回溯到InnoDB,它是一个具有ACID投诉事务存储引擎。为了使InnoDB具有事务性,它必须支持I
in ACID
,即隔离。维护事务隔离的技术是通过MVCC(Multiversion并发控制)完成的。简单来说,InnoDB会在事务尝试更改数据之前记录其数据。在哪里记录?在系统表空间文件中,更好地称为ibdata1。这需要磁盘I / O。
既然InnoDB和MyISAM都执行磁盘I / O,那么哪些随机因素决定了谁更快?
DELETEs
和引起的数据碎片UPDATEs
因此,在繁重的读取环境中,如果有足够的数据被写入ibdata1中包含的撤消日志中以支持事务行为,则具有固定行格式的MyISAM表可能胜过InnoDB从InnoDB缓冲池中读出的数据施加在InnoDB数据上。仔细计划您的数据类型,查询和存储引擎。数据增长后,移动数据可能会变得非常困难。
顺便说一句,我在5天前写了这样的内容:如何为mySQL分配内存限制?
检查此站点,它具有非常有用的信息:
http://www.mysqlperformanceblog.com/2007/11/01/innodb-performance-optimization-basics/
http://www.mysqlperformanceblog.com/2007/11/03/choosing-innodb_buffer_pool_size/
您还可以调整文件系统。我在具有最佳sunit和swidth值的 XFS上获得了良好的性能结果(当然,如果您使用RAID)