如果一个表的索引大小为1TB,则应使用多少内存

时间:2015-06-21 15:19:06

标签: mysql

如果表具有1TB索引大小的主键(bigint)。

那么,如果我想在此表中搜索id = ?,我的硬件要求是否大于1TB的RAM?

P / S:我不知道硬件要求应该如何购买以进行测试。

更新

表:

id          bigint - primary key
value       bigint - index

存储:InnoDb。
我需要存储的行数:30-60亿。

2 个答案:

答案 0 :(得分:1)

不,你不需要比索引大小更多的内存。 SQL会将页面带入内存(我认为它们是2K)。当它运行内存时,它只会使页面内存不足。索引搜索将需要非常少的内存。即使索引扫描也不需要将完整索引存储在内存中(任何时候)。

答案 1 :(得分:0)

在表现方面,也许。在硬件要求方面,那么" no"。 SQL知道如何管理大于内存的数据结构。

表中的125 十亿行(即使是现在)也是一个大表。您正在使用bigint,因此您需要大量的行。当然,当索引只能驻留在内存中时,事情最有效。为此,我不想反对1Tbyte +内存。

您可以在id列上进行分区,并显着降低内存要求。如果id的典型用法是针对一系列id,这将特别有用。例如,如果id是按顺序分配的,并且99%的id是过去一天的,那么你可以(基本上)按天划分数据。你真的会按照每天的最小id值对数据进行分区,但它会产生相同的效果。

因此,如果您有1,000天的数据,那么此分区的索引只需要1 GB。您可以为其他分区的索引提供更多Gbytes。请注意,从其他日期搜索ID需要将分区索引加载到内存中,这是额外的开销。

此解决方案可以完全依赖于查询负载。如果您需要随机访问索引中的所有行,那么最佳结构可能是将整个索引存储在内存中。