2015-06-21 103 views
0

如果一个表的索引大小为1TB,那么主键(bigint)。如果一个表的索引大小为1TB,应该使用多少内存

那么如果我想在这张表中搜索id = ?应该有硬件要求大于1TB的RAM吗?

P/S:我不知道如何购买硬件需求来测试它。

更新时间:

表:

id   bigint - primary key 
value  bigint - index 

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

+0

表格的大小和索引的类型是什么?你在储存什么? bigint索引将支持1250亿行。这是一行记录。我怀疑你的数据模型可以改进。 –

+0

我要更新我的问题。 – vietean

+1

不,你不需要比索引更大的内存。这将是一个索引寻求。如果它是扫描,它仍然不需要比索引更大的内存。 – Paparazzi

回答

0

就性能而言,也许吧。在硬件要求方面,然后是“否”。 SQL知道如何管理大于内存的数据结构。

A 125 billion表中的行是(即使是现今)大表。您正在使用bigint,因此您预计会有很多行。当然,当索引可以驻留在内存中时,事情效果最好。我不想为此目的争论1TB以上的内存。

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

所以,如果你有1,000天的数据,那么你只需要1GB的索引这个分区。其他分区的索引可以多几GB。请注意,从其他日子搜索ID需要将分区索引加载到内存中,这是额外的开销。

该解决方案完全可以根据查询负载工作。如果您需要随机访问索引中的所有行,那么最好的结构可能会将整个索引存储在内存中。

+0

非常感谢您的回答。 – vietean

1

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

+0

非常感谢您的回答。 – vietean

相关问题