我想提高在大小为 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/