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