如果一个表的索引大小为1TB,那么主键(bigint)。如果一个表的索引大小为1TB,应该使用多少内存
那么如果我想在这张表中搜索id = ?
应该有硬件要求大于1TB的RAM吗?
P/S:我不知道如何购买硬件需求来测试它。
更新时间:
表:
id bigint - primary key
value bigint - index
存储:InnoDB的。
我需要存储的行数:30-60亿。
如果一个表的索引大小为1TB,那么主键(bigint)。如果一个表的索引大小为1TB,应该使用多少内存
那么如果我想在这张表中搜索id = ?
应该有硬件要求大于1TB的RAM吗?
P/S:我不知道如何购买硬件需求来测试它。
更新时间:
表:
id bigint - primary key
value bigint - index
存储:InnoDB的。
我需要存储的行数:30-60亿。
就性能而言,也许吧。在硬件要求方面,然后是“否”。 SQL知道如何管理大于内存的数据结构。
A 125 billion表中的行是(即使是现今)大表。您正在使用bigint
,因此您预计会有很多行。当然,当索引可以驻留在内存中时,事情效果最好。我不想为此目的争论1TB以上的内存。
您可以在id
列上进行分区,并显着降低内存需求。如果id的典型用法是针对一系列id,这将特别有用。例如,如果id是按顺序分配的,并且99%的ID是过去一天,那么您可以(实质上)按天数对数据进行分区。你实际上是通过每天最小的id值对数据进行分区,但它会产生相同的效果。
所以,如果你有1,000天的数据,那么你只需要1GB的索引这个分区。其他分区的索引可以多几GB。请注意,从其他日子搜索ID需要将分区索引加载到内存中,这是额外的开销。
该解决方案完全可以根据查询负载工作。如果您需要随机访问索引中的所有行,那么最好的结构可能会将整个索引存储在内存中。
非常感谢您的回答。 – vietean
不,你不需要比索引大小更多的内存。 SQL将把页面带入内存(我认为它们是2K)。当它运行内存时,它只会将页面从内存中取出。索引查找只需要很少的内存。即使是索引扫描也不需要完整的索引在内存中(在任何时候)。
非常感谢您的回答。 – vietean
表格的大小和索引的类型是什么?你在储存什么? bigint索引将支持1250亿行。这是一行记录。我怀疑你的数据模型可以改进。 –
我要更新我的问题。 – vietean
不,你不需要比索引更大的内存。这将是一个索引寻求。如果它是扫描,它仍然不需要比索引更大的内存。 – Paparazzi