Aka*_*ash 10 mysql innodb myisam
我有一个大约有 10 亿行的表,它的 98% 是读取密集型的。
我尝试使用不同的存储引擎(MyISAM 和 InnoDB)调整数据库
然后运行了一些测试以查看性能
在 where 子句中,我有一个主键 ID,而且似乎由于 MyISAM Key Cache 将所有索引存储在其缓冲区中,因此使用 MyISAM 似乎非常快,大约比 InnoDB 快 2 倍
但是对于 InnoDB 来说,它似乎更慢了!!是不是 InnoDB 不使用任何缓冲区来预加载索引?
在决定使用 MyISAM 或 InnoDB 之前,您必须查看两个存储引擎的缓存方式
读取时,MyISAM 表的索引可以从 .MYI 文件中读取一次并加载到 MyISAM 密钥缓存中(由key_buffer_size确定大小)。如何使 MyISAM 表的 .MYD 读取速度更快?有了这个:
ALTER TABLE mytable ROW_FORMAT=Fixed;
Run Code Online (Sandbox Code Playgroud)
我在过去的帖子中写过这个
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(多版本并发控制)完成的。简单来说,InnoDB 会在事务尝试更改数据之前记录数据的样子。这是在哪里记录的?在系统表空间文件中,更好地称为 ibdata1。这需要磁盘 I/O。
由于 InnoDB 和 MyISAM 都进行磁盘 I/O,哪些随机因素决定谁更快?
DELETEs
和引起的数据碎片UPDATEs
因此,在重读环境中,如果有足够的数据写入包含在 ibdata1 中的撤消日志以支持事务行为,则具有固定行格式的 MyISAM 表的性能可能优于从 InnoDB 缓冲池读取的 InnoDB强加于 InnoDB 数据。仔细规划您的数据类型、查询和存储引擎。一旦数据增长,移动数据可能会变得非常困难。
顺便说一句,我 5 天前写了这样的东西:如何为 mySQL 分配内存限制?
归档时间: |
|
查看次数: |
836 次 |
最近记录: |