我正在优化一个3 GB的表作为MEMORY表,以便对它进行一些分析,我很好奇,如果添加索引甚至帮助MEMORY表。既然数据全部都在内存中,这只是多余的吗?
答案 0 :(得分:4)
不,他们不是多余的。
是的,继续使用索引。
由于全表扫描在内存中的速度有多快,但随着表的增长或加入时,访问具有非索引列的较小表上的内存表的速度可能看起来几乎与索引列相同一起制作更大的结果集会有所不同。
无论引擎使用哪种存储方法(磁盘/内存),只要存储引擎支持,正确的索引就可以提高性能。索引的实现方式可能有所不同,但我知道它们是在表类型MEMORY,INNODB和MyISAM中实现的。 BTW:MEMORY表中索引的默认方法是使用哈希而不是B树。
另外,我通常不建议您对存储引擎进行编码。今天的内存表可能需要明天更改为innodb - SQL和架构应该独立存在。
答案 1 :(得分:4)
不,索引与数据访问速度关系不大。索引重新组织数据以优化特定查询。
例如,如果您将一个平衡的二进制树索引添加到一百万行列,您将能够在大约20个读取操作中找到所需的项目,而不是平均50万个。
因此,在内存中放置数百万行,比磁盘快100倍,可以将蛮力搜索速度提高100倍。添加索引将进一步通过允许数据库执行更智能搜索而不仅仅是更快来提高速度25,000倍>搜索。
事情比这更复杂,因为其他因素发挥作用,你很少从索引中获得如此大的好处。更智能的搜索也是更慢一个接一个:这20个索引的搜索成本远远超过20个强力搜索。然后是索引维护等。
但我的建议是,如果可以,请将数据保存在内存中 - 并将其编入索引。