我正在开发一个需要庞大数据库的项目。目前我们正在使用SQLAlchemy,但我对性能问题有点担心。我的问题是,查询如下:
session.query(DataStorage).filter(DataStorage.storage_path.startswith(path)).all()
SQLAlchemy如何进行实际的翻译和过滤。它是否通过SELECT子句从DataStorage获取所有条目,然后检查它们的每个人?或者它是否知道如何将“过滤器(DataStorage.storage_path.startswith(path))”转换为SQL?在使用本机SQL查询的性能方面损失了多少?
的问候, 波格丹
答案 0 :(得分:2)
SqlAlchemy使用您的代码生成SQL语句。在你的情况下,你有类似的东西:
SELECT * FROM DataStorage WHERE DataStorage.storage_path LIKE 'path%';
使用.all()后,将对数据库运行查询。所以在这种情况下,它将获取结果集迭代器中的所有行并将它们返回给您。
答案 1 :(得分:1)
我不熟悉您正在使用的特定SQLAlchemy构造,但最好的方法是尝试它。打开MySQL中的查询日志记录并查看SQLAlchemy正在生成的查询。您可以尝试手动编写查询并比较两者的性能。 (为此,您需要在数据库中使用大量测试数据。)
通常,ORM对简单的SELECT,WHERE子句,ORDER BY等都可以正常工作。当您开始对数据进行许多连接或大量处理时,构造的查询往往不太理想。这特定于您的应用程序。我通常采用的方法是使用ORM编写内容,并在必要时优化并替换为SQL。