MyISAM 用于数据读取

Aka*_*ash 10 mysql innodb myisam

我有一个大约有 10 亿行的表,它的 98% 是读取密集型的。

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

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

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

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

Rol*_*DBA 6

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

我的ISAM

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

ALTER TABLE mytable ROW_FORMAT=Fixed;
Run Code Online (Sandbox Code Playgroud)

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

数据库

好的,InnoDB 怎么样?InnoDB 是否为查询做任何磁盘 I/O?令人惊讶的是,是的!您可能认为我这么说是疯了,但这绝对是真的,即使对于 SELECT 查询也是如此。此时,您可能想知道“InnoDB 到底是如何为查询进行磁盘 I/O 的?”

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

比较

由于 InnoDB 和 MyISAM 都进行磁盘 I/O,哪些随机因素决定谁更快?

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

结语

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

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


pQd*_*pQd 2

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

看看这里这里

我希望你不要使用 innodb 的默认 mysql 设置 - 它们适用于 2000 年左右的硬件。