【问题标题】:Profiling SQL query分析 SQL 查询
【发布时间】: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


【解决方案1】:

缓慢的一个可能原因 - sql alchemy 是否使用准备好的语句?如果是,那么您可能会遇到性能差异的一个原因是 mysql 优化器在创建两个查询计划时具有不同的信息。

当您从命令行运行查询时,mysql 优化器具有完整的查询,其中填充了所有 where 子句值(如上所示 3),因此可以针对这些值进行显式优化。

当你从 sql alchemy 运行时,mysql 优化器可能只会看到这个(也许 fieldnames.race 和 fieldnames.sex 也被参数化了):

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 >= ?
AND fieldnames.minage <= ?
GROUP BY fieldnames.minage, fieldnames.maxage

因此,优化器必须猜测您可能使用的值,然后围绕它进行优化。不幸的是,它可能会做出错误的猜测,因此在最坏的情况下会创建一个查询计划,使查询运行速度明显低于您的预期。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多