繁体   English   中英

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

[英]Should I create a Mysql table using a MEMORY (HEAP) engine or MyISAM engine?

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

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

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

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

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

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


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


我质疑 InnoDB。 根据我的经验,MyISAM 表对于隐式只读表非常有效。 他们糟糕的地方是释放和重用磁盘块以及处理相关的索引。


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

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

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

使用redis 之类的东西非常适合这种键值存储需求。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM