如何提高Django RESTful API中200万数据查询速度

3
我有一份200万条记录的科研出版物数据。我使用django restframework编写了用于搜索“标题”和“摘要”数据的API。如果我使用Postgres作为数据库,这需要花费12秒,但是如果我使用MongoDB作为数据库,则只需6秒。

但即使6秒对于用户来说也是很长的等待时间。我对“标题”和“摘要”进行了索引,但由于某些摘要文本过长,因此摘要索引失败。

以下是使用MongoDB(MongoEngine作为ODM)的Django模型:

class Journal(Document):
    title = StringField()
    journal_title = StringField()
    abstract = StringField()
    full_text = StringField()
    pub_year = IntField()
    pub_date = DateTimeField()
    pmid = IntField()
    link = StringField()

如何提高查询性能?哪种技术栈可以使搜索和检索更快?


这个问题太宽泛了。具体方案取决于您的查询、索引、硬件、可能的搜索后端以及全文搜索等等,因此可能有许多不同的解决方案。 - Wtower
当然可以,但这就是我面临的问题。您能否建议我更好的解决方法或任何简化问题的建议都可以。回答您的快速问题:我也在使用全文搜索,在Mac Pro硬件上。我测试了Postgres和MongoDB作为数据库。请告诉我,您想要了解什么更多信息来解决这个问题。 - rrmerugu
1个回答

4

以下是有关Django ORM在Postgres中进行优化的一些指针:

  • 对于那些经常搜索并且在条目之间具有重复性的字段(例如“title”),请使用db_index=True
  • 使用values()values_list()从QuerySet中仅选择您想要的列。
  • 如果在这些列中执行全文搜索(例如contains查询),请记住Django支持在Postgres数据库上直接进行全文搜索
  • 使用print queryset.query检查进入数据库的SQL查询类型以及是否可以进行改进。
  • 许多Postgres优化技术依赖于可以使用RawSQL表达式在Django中制作的自定义SQL查询。
  • 请记住,在关系或非关系数据库中,有许多搜索数据的方法。在您的情况下,MongoDB并不比Postgres“更快”,只是更好地查询您真正想要的内容。

我不支持MongoDB比Postrges更好。当我尝试了两者之后,我发现MongoDB的结果很好,就是这样。我使用db_index=True进行索引,并使用values()使检索变得轻松,我甚至删除了在API中使用queryset.count()的'count',因为它会影响性能。让我尝试一下使用queryset.query会发生什么。我会在尝试完所有方法后更新。+1 for the explanation. - rrmerugu
你发现MongoDB还是更快吗? - Burf2000

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接