索引有助于mysql内存表吗?

索引有助于mysql内存表吗?,mysql,memory,optimization,Mysql,Memory,Optimization,我优化了一个3 GB的表作为内存表,以便对其进行一些分析,我很好奇添加索引是否对内存表有帮助。因为数据都在内存中,所以这只是冗余吗?不,它们不是冗余的 是的,继续使用索引 在具有非索引列的较小表上访问内存表的速度可能与索引表的速度几乎相同,这是因为完整表扫描在内存中的速度有多快,但随着表的增长或将它们连接在一起以生成更大的结果集,结果会有所不同 无论引擎使用何种存储方法(磁盘/内存),只要存储引擎支持,适当的索引都将提高性能。索引的实现方式可能有所不同,但我知道它们是在内存、INNODB和MyI

我优化了一个3 GB的表作为内存表,以便对其进行一些分析,我很好奇添加索引是否对内存表有帮助。因为数据都在内存中,所以这只是冗余吗?

不,它们不是冗余的

是的,继续使用索引

在具有非索引列的较小表上访问内存表的速度可能与索引表的速度几乎相同,这是因为完整表扫描在内存中的速度有多快,但随着表的增长或将它们连接在一起以生成更大的结果集,结果会有所不同

无论引擎使用何种存储方法(磁盘/内存),只要存储引擎支持,适当的索引都将提高性能。索引的实现方式可能有所不同,但我知道它们是在内存、INNODB和MyISAM表类型中实现的。顺便说一句:内存表中索引的默认方法是使用哈希而不是B树


另外,我通常不建议对存储引擎进行编码。今天的内存表可能明天需要更改为innodb——SQL和模式应该独立运行。

不,索引与数据访问速度没有多大关系。索引重新组织数据以优化特定查询

例如,如果将平衡二叉树索引添加到一百万行列中,您将能够在大约20次读取操作中找到所需的项,而不是平均50万次

因此,将这百万行放入内存,比磁盘快100倍,将使暴力搜索速度提高100倍。添加索引将使数据库能够执行更智能的搜索,而不仅仅是更快的搜索,从而将速度进一步提高25000倍

事情比这更复杂,因为还有其他因素在起作用,你很少能从指数中获得如此大的收益。更智能的搜索也会一个接一个地变慢:这20个索引搜索的成本远远高于20个暴力搜索。还有索引维护等


但我的建议是,如果可以的话,将数据保存在内存中,并对它们进行索引。

看来mysql(8)开发者(错误地)同意了,99%的时候忽略内存表中的索引。我有一个很好的现实例子:我尝试在3秒钟的时间范围内获得一个INT列(通过索引扫描几百行)。mysql会对数百万行进行全表扫描,即使在我使用“强制索引”时,也会导致查询延迟150毫秒,这将占用1/1000的时间。Mysql充满了这些bug,我不认为这些是意外。这是Oracle的故意行为。内存表mysql会忽略大多数索引。它不会使用btree,即使它完全适合查询并将性能提高了1000倍。