mysql - 我应该使用 MEMORY (HEAP) 引擎还是 MyISAM 引擎创建 Mysql 表?

标签 mysql memory myisam

我想提高在大小为 1 GB 的 MySQL MyISAM 表上运行的一些数据库查询的速度。

该表大约有 1000 万行,大约有 10 列 INT 和 VARCHAR。该表仅用于读取,不会对表进行更新或插入。我在 table 上执行的唯一查询是:

SELECT name,age FROM myisamtable WHERE category1='example' AND (category2='example2' OR category4='example4') ORDER BY id DESC LIMIT 1000,2000

我应该将表转换为内存以获得更快的性能吗? (我不在乎系统重新启动时是否丢失表)。或者最好将其保留为 MyISAM 并增加一些设置,例如 key 缓冲区大小等......?

最佳答案

如果将整个表放入内存中,任何不查询的行仍然会消耗空间。我想您不太可能确定所有行都始终被查询。 OTOH,您执行的任何查询都将被缓存(只要您将内存表所需的内容分配给缓存即可。

内存表适用于非常不寻常的情况;使用它们进行手动分配的查询缓存不太可能高效。


我希望这也是一个易于测试的情况,因为它似乎是您当前遇到的查询问题。另一个描述情况的问题怎么样?


我质疑InnoDB。根据我的经验,MyISAM 表对于隐式只读表非常高效。它们的糟糕之处在于释放和重用磁盘 block 以及调整相关索引。


临时表是一种反模式。搜索查询优化策略并消除临时表(自动或手动)始终是首要任务之一。当有人发现它们有帮助时,通常表明还需要进行其他重要改进

关于mysql - 我应该使用 MEMORY (HEAP) 引擎还是 MyISAM 引擎创建 Mysql 表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5628311/

相关文章:

MySQL - 如何执行此字符串搜索?

mysql - 无法启动mysql了

class - Matlab:类对象的空闲内存

mysql - IntegrityError at/accounts/signup/in django

mysql - InnoDB 到 MyISAM 转换奇怪的性能行为

mysql - CREATE TRIGGER 来监视特定表行

php - 我的具有多个输入的表单中的唯一 ID 无法保存在我的数据库 Php 中

c++ - 可以读/写EEPROM地址但是只能读/写第一个内存页

c++ - 动态内存控制的优点是什么?

innoDB 表的 MySQL 全文搜索解决方法