如果表具有1TB索引大小的主键(bigint)。
那么,如果我想在此表中搜索id = ?
,我的硬件要求是否大于1TB的RAM?
更新
表:
id bigint - primary key
value bigint - index
存储:InnoDb。
我需要存储的行数:30-60亿。
答案 0 :(得分:1)
不,你不需要比索引大小更多的内存。 SQL会将页面带入内存(我认为它们是2K)。当它运行内存时,它只会使页面内存不足。索引搜索将需要非常少的内存。即使索引扫描也不需要将完整索引存储在内存中(任何时候)。
答案 1 :(得分:0)
在表现方面,也许。在硬件要求方面,那么" no"。 SQL知道如何管理大于内存的数据结构。
表中的125 十亿行(即使是现在)也是一个大表。您正在使用bigint
,因此您需要大量的行。当然,当索引只能驻留在内存中时,事情最有效。为此,我不想反对1Tbyte +内存。
您可以在id
列上进行分区,并显着降低内存要求。如果id的典型用法是针对一系列id,这将特别有用。例如,如果id是按顺序分配的,并且99%的id是过去一天的,那么你可以(基本上)按天划分数据。你真的会按照每天的最小id值对数据进行分区,但它会产生相同的效果。
因此,如果您有1,000天的数据,那么此分区的索引只需要1 GB。您可以为其他分区的索引提供更多Gbytes。请注意,从其他日期搜索ID需要将分区索引加载到内存中,这是额外的开销。
此解决方案可以完全依赖于查询负载。如果您需要随机访问索引中的所有行,那么最佳结构可能是将整个索引存储在内存中。