代码之家  ›  专栏  ›  技术社区  ›  Dana Robinson

数据库如何处理内存中无法容纳的数据表?

  •  4
  • Dana Robinson  · 技术社区  · 15 年前

    假设您有一个非常大的表,比如说几十亿个无序的行,现在您想要索引它以便快速查找。或者,您可能要批量加载它,并用聚集索引将其订购到磁盘上。显然,当你得到这么大的数据量时,你必须停止假设你可以在内存中进行排序之类的事情(好吧,不需要进入虚拟内存并承受巨大的性能冲击)。

    有人能给我一些关于数据库如何处理大量数据的线索吗?我猜有些算法使用某种形式的智能磁盘缓存来处理所有数据,但我不知道从哪里开始。特别欢迎推荐信。也许是高级数据库教科书?

    5 回复  |  直到 15 年前
        1
  •  6
  •   Dmitry    15 年前

    多路合并排序是对大量内存进行排序的关键字。

        2
  •  1
  •   che    15 年前

    据我所知,大多数索引都使用某种形式的 B-trees 不需要在内存中存储东西。您可以简单地将树的节点放在文件中,然后跳到文件中的变量位置。这也可以用于排序。

        3
  •  0
  •   blispr    15 年前

    您必须以某种方式对数据集进行分区。在单独的服务器RAM上分布每个分区。如果我有十亿个32位的内存,那就是32GB的内存。这只是你的索引。

    对于低基数数据,例如gender(只有2位-男性、女性)-您可以用小于一个字节的字节表示每个索引项。在这种情况下,Oracle使用位映射索引。

        4
  •  0
  •   CoderDennis    15 年前

    您正在构建数据库引擎吗?

    编辑: 我在90年代中期建立了一个基于光盘的数据库系统。

    固定大小的记录最容易处理,因为定位记录的文件偏移量可以很容易地计算为记录大小的倍数。我也有一些记录大小可变的。

    我的系统需要为阅读而优化。数据实际上存储在CD-ROM上,所以是只读的。我为要搜索的每一列创建了二进制搜索树文件。我获取了一个开放源码内存中的二进制搜索树实现,并将其转换为对磁盘文件进行随机访问。从每个索引文件中进行排序读取很容易,然后根据索引顺序从主数据文件中读取每个数据记录也很容易。我不需要做任何内存排序,而且这个系统比当时在客户机上运行的任何可用RDBMS系统都快得多。

    对于固定的记录大小数据,索引可以只跟踪记录编号。对于可变长度的数据记录,索引只需要在记录开始的文件中存储偏移量,每个记录都需要以指定其长度的结构开始。

        5
  •  -1
  •   Sergey Kuznetsov    15 年前

    隐马尔可夫模型。。。有趣的问题。

    我认为大多数使用操作系统机制进行内存管理的数据库管理系统,当物理内存结束时,内存表将交换。