【问题标题】:B-Tree database optionsB 树数据库选项
【发布时间】:2013-03-16 10:38:10
【问题描述】:

我需要实现两个不同 pgsql 表的两个 b-tree 索引,最好在运行 python webserver 进程的同一个盒子上的内存中(查询需要尽可能快)。我想知道实现这一点的最佳方法:

  1. 在进程内的内存中索引和维护 b 树(使用 python 库手动)
  2. 在单独的内存数据库(redis、mongo 等)中实现索引
  3. 使用 Neo4j 或 Flock 之类的图形数据库(玩新热点的借口)
  4. 调整 pgsql 以自行创建索引。 (以数据库中其他数据的性能下降为代价?)

我的需求是,按重要性排列:

  • 查询速度
  • 最近邻搜索*
  • 索引大小
  • 开源
  • python 绑定 :)

附加说明:树一次可以达到数千个节点,必须承受高插入/删除率

*所以如果我搜索 756.837,但只有 755.928 和 757.113 存在,则根据参数返回其中一个

需要明确的是,这个 postgres 数据库将在处理的数据之上提供传统的 webapp crud 数据。我愿意增加复杂性以维护 webapp 数据的性能。

【问题讨论】:

  • ..像 elasticsearch/solr 这样的东西呢? (但如果您不需要全文搜索等内容,这可能是一种矫枉过正)
  • @redShadow 可能有点矫枉过正,因为我只是通过关联的数值索引一系列对象
  • 你在说多少数据?有了足够的 RAM,postgres 会将整个数据库放入内存中。鉴于 postgres 的稳健性,似乎构建和维护一个单独的解决方案比让引擎为你做这件事更难。
  • @thisfeller 可能不超过一个千兆字节,最多可能两个。我考虑过这一点,但是我已经在一些 web 应用程序表上建立了索引,我真的宁愿不牺牲性能提升。如果检索用户个人资料的时间比处理用户数据的时间长,那么用于我的数据处理的快速索引毫无价值。
  • @thisfeller 另外,如果要更多地研究它,我将不得不同时并且经常地REINDEX。不幸的是,我认为我将不得不使用更神秘的东西

标签: database postgresql indexing b-tree


【解决方案1】:

第一步是看看你可以将 PostgreSQL 索引推到多远来做你想做的事。典型的 btree 索引速度很快,但它们没有很多特性。特别是,他们不会很好地进行 knn 搜索。根据您的需要,您可能希望将索引从 Btree 更改为 GiST。 GiST 提供了 KNN 搜索(假设您的数据类型支持此功能!),并允许您做很多其他您正在寻找的事情。不利的一面是,根据您的数据类型,您最终可能需要进行一些编程才能获得对某些数据类型的适当支持。

GiST 提供了比标准 btree 索引更多的搜索选项,但它们的查询速度也有点慢。然而,主要优点是它们确实支持比 GIN 索引更高的插入/更新率,并且它们也支持 knn 搜索。

如果这对您不起作用....您可能希望在内存中实现其他东西,可能使用内存缓存(如 memcached),甚至只是简单的旧 Sys V IPC 和单独的进程。不过要小心并发访问内存!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-02-09
    • 2012-01-13
    • 2014-09-20
    • 1970-01-01
    • 2021-07-18
    • 2011-02-09
    • 1970-01-01
    • 2012-11-05
    相关资源
    最近更新 更多