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

时间:2011-04-11 22:30:01

标签: mysql memory heap myisam

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

该表有大约1000万行,并且有大约十列INT和VARCHAR。该表仅用于READ,并且表中不会有更新或插入。我在桌面上唯一的查询是:

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

我应该将表格转换为内存以获得更快的性能吗? (如果我在系统重启时失去了表,我不在乎)。或者更好的是将它保持为MyISAM并增加一些设置,如密钥缓冲区大小等。?

3 个答案:

答案 0 :(得分:2)

如果将整个表放在内存中,那么您不查询的任何行仍将占用空间。我想你不太可能确定所有行都被查询。 OTOH,任何你查询都将被缓存(只要你分配内存表所需的内容来缓存。

内存表适用于非常特殊的情况;将它们用于手动分配的查询缓存是不太可能有效的。


我希望这也是一个容易测试的情况,因为它似乎是您目前遇到的查询问题。另外一个描述情况的问题呢?


我质疑InnoDB。根据我的经验,MyISAM表对于隐式只读表非常有效。他们吮吸的地方是释放和重用磁盘块并使相关索引变得笨拙。


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

答案 1 :(得分:1)

据我所知,如果内存不足,存储在MEMORY中的表将被截断。

您可以做的是使用WHERE语句中定义的子集创建临时表,并使用临时表执行顺序查询。我注意到性能大幅提升。

答案 2 :(得分:0)

使用类似redis的内容非常适合这种键值存储要求。