内存/堆引擎表与具有大缓冲池的大多数 innodb 表数据库的性能相同吗?我通常有 2 个表 - 1 个带有 varchars 和几行的 innodb 以及一个紧凑大小的内存表(5 行,主要是 PK 和用于大量读取的索引整数。我最近了解了 innodb 缓冲区,所以我的表克隆系统过度杀伤和无用或还是比innodb快?
2 回答
在内存中的表必须具有更高的性能,至少在理论上:在 InnoDB 中,即使有一个很大的缓冲池,缓存中也会有基于块的结构,所以一些块只会部分满,这是一个开销. 另一个原因是内存中的表没有行版本或行锁,所以同样,这将使用更少的内存。但请注意:内存中的表仍然没有行级锁定,因此如果您运行大型更新,您实际上可能会发现使用 InnoDB 更具可扩展性。
因此,总结一下:MEMORY 表 - 存储相同数量的数据的内存可能更少,InnoDB - 可能更具可扩展性。
当然,一切都需要针对您的特定情况进行测量。
也许如果您无论如何都需要将数据存储在内存中,请选择内存数据库?(无耻的插头)。
从 InnoDB 缓冲池中读取的速度将与 Memory 表一样快。
在某些情况下,内存表甚至可以胜过缓冲的 InnoDB 表,前者还支持Hash 索引,而后者仅支持 B-Tree 索引。根据查询的配置文件,您可能会使用哈希表获得更快的读取速度。
此外,如果某些查询需要此内存空间,或者很少使用数据,则可以将缓冲的 InnoDB 表从缓冲区中清除。通过显式地将数据复制到内存表中,您可以保证您的数据将始终在内存中。
我还应该提到,无论缓冲池的大小如何,对 InnoDB 表的更新都需要在某个阶段刷新到磁盘。但我知道这不适用于您的用例。
现在这是理论。只有当这些数据被非常非常频繁地读取时,您才应该考虑这些因素。