Python SQLAlchemy Marshmallow查询和序列化为JSON的速度较慢
我对这有点陌生,所以如果有人能帮助我,那就太棒了 所以我在SQLAlchemy中为我正在开发的烧瓶应用程序设置了一些模型。在我构建应用程序时,我用一些虚假数据填充了db(目前是SQLite),我有点惊讶于我的一个呼叫有多慢 我在数据库中有一个名为Menu的表。菜单有一个子项sections,它有一个子项items。像这样:Python SQLAlchemy Marshmallow查询和序列化为JSON的速度较慢,python,json,sqlalchemy,flask-sqlalchemy,marshmallow,Python,Json,Sqlalchemy,Flask Sqlalchemy,Marshmallow,我对这有点陌生,所以如果有人能帮助我,那就太棒了 所以我在SQLAlchemy中为我正在开发的烧瓶应用程序设置了一些模型。在我构建应用程序时,我用一些虚假数据填充了db(目前是SQLite),我有点惊讶于我的一个呼叫有多慢 我在数据库中有一个名为Menu的表。菜单有一个子项sections,它有一个子项items。像这样: 菜单 部分 项目 我查询的对象是1个菜单,它有4个部分,每个部分有10个项目 在我的Flask路由中,我使用Menu.query.get(id)查询DB,并使用m
- 菜单
- 部分
- 项目
- 部分
另外。我最初还有两个更深的层次(项目有选项,可以选择),但完成这项工作需要整整一秒钟的时间,所以当用户请求特定项目时,我将它们移动到一个单独的端点。我同意250ms是多余的,因为所有内容都是本地的。我认为缓慢的原因是为了构建JSON而执行了多个SQL查询 在SQLALCHEMY配置上设置
SQLALCHEMY\u ECHO=True
将显示正在生成的SQL查询并确认这一点
您还没有提供数据库模型,但是您可能会发现您的关系正在被延迟加载,因此正在为树中的每个对象进行新的SQL查询。您可以在SQLAlchemy文档的一节中找到更多信息
在子关系(即菜单->区段和区段->项目)上设置
lazy='joined'
,将导致使用联接而不是默认选择来急切地加载子关系。它们正在被延迟加载。我会换成joined,看看是否有任何改进。谢谢,哇。这当然有帮助。在这一变化中下降到50-75毫秒。好奇的是,急加载与懒惰相比有什么缺点吗?数据库将执行连接,因此将做更多的工作,但是如果您知道查询需要数据,那么它是获取数据的最有效的方法(与执行单独的“懒惰”查询相比)。或者,您可以将默认值设置为延迟加载,并在需要加入的查询上使用joinedload()选项。