如何提高SQLAlchemy的性能?

7
我开发了一个客户端应用程序,使用简单的API通过HTTP与Python 2服务器通信。服务器使用SQLAlchemy的ORM广泛为这些HTTP请求提供数据。问题是,即使只有少数活动客户端,我的CPU使用率也非常高。这个服务器应该能够同时为几百个客户端提供服务,每个客户端每秒大约1个请求,所以它应该仍然可以管理(或者我希望如此)。
如何提高性能?我知道问题在于ORM,因为cProfile很清楚地显示了这一点。单个查询显然执行了大约10000个Python指令,这似乎非常奇怪。我尝试插入不同的数据库引擎/后端,并为了好玩而更改解释器为Pypy,但这显然没有帮助原始问题,也没有提高性能。
我做错了什么?我真的希望这是一个“嗯,傻瓜!”的问题。
我的关系应该是不同类型的关系吗?急切的、懒惰的、动态的等等?现在,我没有特别指定任何内容。
非常感谢您的帮助。

6
请看一下我在Stack Overflow上的回答https://dev59.com/nnM_5IYBdhLWcg3w6HzT#1175677,其中有一些可以开始的地方。 - zzzeek
1个回答

3
这是一个非常广泛的问题,但在使用ORM时有一些原则要遵循。ORM昂贵且可能会占用资源;想象一下,在将数据纳入模型时,所有涉及对象关系的操作都在后台发生!ORM如何知道何时获取数据?它应该在您触摸对象头时急切地加载和构建所有关系,还是仅在最初的查询中急切地加载您始终需要的内容?这就是zzzeek的回答的作用;查看查询日志并查看ORM的操作。然后你会说,天哪!我只需要这个东西,为什么它要做那么多事情,然后你会学习急切加载与延迟加载,更新你的模型,然后你的ORM速度就会提高100倍。你也可以选择懒加载所有内容,但是你可能会观察到一堆非常具体的查询而不是单个批量查询,所以其他事情会变得更慢。总的来说,关键是不要在不需要时获取大量数据,但尽一切可能进行批量查询,以避免进行无数次单个查询。
https://dev.to/tinazhouhui/introduction-to-object-relational-mapping-the-what-why-when-and-how-of-orm-nb2

1
谢谢你的回答,虽然我必须承认,经过10年后,这个答案对我来说已经不再那么相关了。 :) - svenstaro

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