SQLAlchemy 性能
我正在做一个需要大数据库的项目。目前我们使用的是SQLAlchemy,但我对性能问题有点担心。我的问题是,像这样的查询:
session.query(DataStorage).filter(DataStorage.storage_path.startswith(path)).all()
SQLAlchemy是怎么实际进行转换和过滤的?它是先用SELECT语句从数据存储中获取所有条目,然后再检查每一个条目吗?还是说它知道怎么把“filter(DataStorage.storage_path.startswith(path))”转换成SQL?使用原生SQL查询在性能上会损失多少?
问候,
博格丹
2 个回答
1
我对你使用的SQLAlchemy具体内容不太熟悉,但最好的办法就是亲自试试。你可以在MySQL中开启查询日志,这样就能看到SQLAlchemy生成的查询语句。你还可以尝试手动写这个查询,然后比较一下两者的性能。(你需要在数据库里准备一些测试数据来进行这个对比。)
一般来说,ORM在处理简单的SELECT查询、WHERE条件、ORDER BY排序等方面表现得很好。但是当你开始进行很多连接查询或者对数据进行大量处理时,生成的查询可能就不那么高效了。这要根据你的应用情况来定。我通常的做法是先用ORM写出查询,然后在必要的时候进行优化,换成SQL语句。
2
SqlAlchemy会根据你的代码生成一个SQL语句。在你的例子中,生成的语句可能是这样的:
SELECT * FROM DataStorage WHERE DataStorage.storage_path LIKE 'path%';
当你使用.all()时,这个查询会在数据库中执行。所以在这种情况下,它会获取结果集中的所有行,并把它们返回给你。