低内存且查询最快的数据库用于Python项目

3 投票
2 回答
1020 浏览
提问于 2025-04-17 02:00

我正在把一个用Java写的GAE应用迁移到Python(非GAE),主要是因为价格原因,所以我打算租一个小服务器,并且想找一个符合以下要求的数据库:

  • 占用内存少(或者可以调节,或者是可预测的)
  • 对简单的文档/树状数据,按键快速查询(我不太在乎写入性能,假设会有索引)
  • 要和Pypy 1.6兼容(至少要支持Python 2.7)

我的数据大致是这样的:

  • Id:短的键字符串
  • 标题
  • 创作者:一个包含其他数据结构的数组,这些数据结构有一个id(作为键)、名字、网站地址等。
  • 标签:标签的数组。每个标签可以有多个父标签,也有名字、id等。
  • 许可证:一个描述许可证的数据结构(比如CC、GPL等),包含名字、相关网址等。
  • 添加时间:它在我们网站上添加的时间。
  • 翻译:指向其他条目的指针,这些条目是某个创作的翻译。

我的查询非常简单。常见的情况有:

  • 按标签过滤,并按添加时间排序。
  • 选择几个(分页),按添加时间排序。
  • (可能,尚未完成)按创作者过滤。
  • (尚未完成但计划中)在表单中添加一些自动完成功能,所以我需要搜索某些字段是否包含子字符串(类似于'LIKE'查询)。

数据量不大。目前大约有50MB的数据,但我计划将数据集扩大到大约10GB。

另外,我想从头开始重建这个,所以我对任何选项都持开放态度。你觉得哪个数据库能满足我的要求呢?

编辑:我想对不同的选项做一些基准测试,并分享结果。目前我选择了MongoDB、PostgreSQL、MySQL、Drizzle、Riak和Kyoto Cabinet。

2 个回答

3

如果你想把一个应用程序迁移到新的环境,最简单的方法可能是使用AppScale,它实现了大部分应用引擎的功能。特别是,你可能想用HyperTable这个数据存储,它和Google应用引擎的数据存储非常相似。

补充一下:好吧,你打算重新设计一下。我想和你聊聊你问题中的一些要点。

低内存使用

这其实和你在数据库中想要的正好相反;你希望尽可能多的数据能够放在内存里。这可能意味着你需要调整数据集的结构,使其更高效,或者添加memcached节点,这样你就可以把数据分散到多个主机上,让每个主机只存一小部分数据,这样就能放进内存里。

为了让这个观点更清晰,想想看,从内存中读取数据的速度大约是从硬盘读取的1000倍;一个能从内存中满足所有查询的数据库,处理的工作量是一个需要访问硬盘的数据库的10倍,后者即使只有1%的查询需要访问硬盘。

我计划有一个大约10GB的数据集。

我觉得10GB并不能算是一个“巨大”的数据集。实际上,这个数据量可能可以放进一台相当大的数据库服务器的内存里;你不需要超过一个memcached节点,更不用说额外的持久化节点了(通常硬盘的容量是以TB为单位的,远远大于你预期的数据集)。


根据这些信息,我强烈建议使用一个成熟的数据库产品,比如PostgreSQL,它能很好地满足你描述的数据需求,并且提供你所需要的所有功能。如果将来你需要扩展超过PostgreSQL的能力,你也会有真实的工作负载来分析,知道瓶颈到底在哪里。

1

我推荐使用PostgreSQL,主要是因为它能满足你的需求,能够扩展,速度快,使用起来相对简单,而且很稳定。

在给出的示例查询中,它的速度非常快,如果用来查询文档,可能会更快。

撰写回答