【发布时间】:2011-06-29 10:12:20
【问题描述】:
我在 MySQL 中使用 sqlalchemy(表达式语言,不是完整的 ORM)并且遇到了一些意想不到的缓慢。尤其是在 sqlalchemy 中执行 select 查询所花费的时间是从 mysql 命令行执行相同查询所花费的时间的十倍。
来自 cprofile 的输出:
ncalls tottime percall cumtime percall filename:lineno(function)
100 206.703 2.067 206.703 2.067 {method 'query' of '_mysql.connection' objects}
MySQL 时间:0.26 秒
共识似乎是使用 sqlalchemy 会有一些开销,但几乎没有这么多。关于什么可能导致此类行为的任何建议?
查询的一般形式为:
SELECT fieldnames.minage, fieldnames.maxage, fieldnames.race,
fieldnames.sex, sum( pop.population ) AS pop, pop.zip5
FROM pop
INNER JOIN fieldnames ON fieldnames.fieldname = pop.fieldname_id
WHERE fieldnames.race IN ("White alone")
AND fieldnames.sex IN ("Female")
AND fieldnames.maxage >=101
AND fieldnames.minage <=107
GROUP BY fieldnames.minage, fieldnames.maxage
【问题讨论】:
-
确保你没有在 sqlalchemy 运行后直接在 MySQL 中运行查询,否则结果将在查询缓存中。如果有记忆,RESET QUERY CACHE 会清除所有内容。通过 sql alchemy 应该不会有太大区别。
-
我在发布问题后就考虑过缓存。我正在尝试清除缓存,但初步结果表明这不是问题。
-
网络问题 - 如果您在本地从命令行运行 MySQL,但您的应用程序在远程,这可能会引入延迟,但它必须是大量数据和/或网络缓慢。分析信息几乎排除了 sqlalchemy 可以做的任何事情。
-
您总是可以分析 Python 代码。 docs.python.org/library/profile.html
标签: python sql sqlalchemy