【问题标题】:SQLAlchemy-Marshmallow slow to query and serialize to JSONSQLAlchemy-Marshmallow 查询和序列化为 JSON 的速度很慢
【发布时间】:2016-11-15 10:58:11
【问题描述】:

我对此有些陌生,所以如果有人可以帮助我,那就太棒了。

所以我在 SQLAlchemy 中为我正在开发的 Flask 应用程序设置了一些模型。在构建应用程序时,我用一些假数据填充了数据库(当前是 SQLite),我有点惊讶我的一个调用有多慢。

我在数据库中有一个名为 Menu 的表。菜单有一个子项,sections,它有一个子项。像这样:

  • 菜单
    • 部分
      • 项目

我要查询的对象是 1 个 Menu,它有 4 个 Section,每个 Section 有 10 个项目。

在我的 Flask 路由中,我使用 Menu.query.get(id) 查询数据库并使用棉花糖将其序列化为 JSON。

整个过程需要 250 毫秒的时间才能在我的本地机器上返回。

所以我的问题是: 我担心250毫秒是愚蠢的吗? 缓慢的罪魁祸首是什么? - 糟糕的架构设计? - SQLite / 使用 SQL 数据库? - 还有什么?

任何帮助将不胜感激。

另外。我最初还有 2 个更深的级别(项目有选项可以选择),但它需要大约一整秒才能完成,所以当用户请求特定项目时,我将它们移动到单独的端点。

【问题讨论】:

    标签: python json sqlalchemy flask-sqlalchemy marshmallow


    【解决方案1】:

    我同意 250 毫秒是过多的,因为一切都是本地的。我预计缓慢的原因是正在执行多个 SQL 查询以构建 JSON。

    在 SQLAlchemy 配置上设置 SQLALCHEMY_ECHO = True 将显示正在生成的 SQL 查询并确认这一点。

    您尚未提供数据库模型,但您可能会发现您的关系被延迟加载,因此正在为树中的每个对象创建一个新的 SQL 查询。您可以在 SQLAlchemy 文档的Relationship Loading Techniques 部分找到更多信息。

    在子关系上设置lazy='joined'(即菜单 -> 部分和部分 -> 项)将导致使用 JOIN 而不是默认的 SELECT 来急切加载子关系。

    【讨论】:

    • 它们正在被延迟加载。我会转去加入,看看有没有改善。谢谢。
    • 哇。这当然有帮助。更改为 50-75 毫秒。只是好奇,急切加载与延迟加载有什么缺点?
    • 数据库将执行 JOIN,因此会做更多的工作,但如果您知道查询需要数据,那么这是获取数据的最有效方式(与执行单独的 'lazy ' 询问)。或者,您可以将默认设置为延迟加载,并在您想要加入的查询上使用joinedload() 选项。
    猜你喜欢
    • 2021-06-27
    • 2023-03-13
    • 1970-01-01
    • 2016-06-08
    • 1970-01-01
    • 2021-03-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多