我想提高一些数据库查询的速度,我在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并增加一些设置,如密钥缓冲区大小等。?
答案 0 :(得分:2)
如果将整个表放在内存中,那么您不查询的任何行仍将占用空间。我想你不太可能确定所有行都被查询。 OTOH,任何你做查询都将被缓存(只要你分配内存表所需的内容来缓存。
内存表适用于非常特殊的情况;将它们用于手动分配的查询缓存是不太可能有效的。
我希望这也是一个容易测试的情况,因为它似乎是您目前遇到的查询问题。另外一个描述情况的问题呢?
我质疑InnoDB。根据我的经验,MyISAM表对于隐式只读表非常有效。他们吮吸的地方是释放和重用磁盘块并使相关索引变得笨拙。
临时表是反模式。搜索查询优化策略和消除临时表(自动或手动)始终是首要任务之一。当有人发现它们有用时,通常表明还有其他重要的改进
答案 1 :(得分:1)
据我所知,如果内存不足,存储在MEMORY中的表将被截断。
您可以做的是使用WHERE语句中定义的子集创建临时表,并使用临时表执行顺序查询。我注意到性能大幅提升。
答案 2 :(得分:0)
使用类似redis的内容非常适合这种键值存储要求。