0

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

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

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

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

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

*因此,如果我搜索 756.837,但仅存在 755.928 和 757.113,则根据参数返回任一

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

4

1 回答 1

0

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

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

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

于 2013-05-09T08:41:01.283 回答