两个外键表的过滤器工作缓慢

时间:2011-07-19 17:38:11

标签: sql django performance database-design

*我无法添加代码因为我不在那台电脑附近

简单模型包括:

class Test
    static data about test
class Site
    static data about site
class Result
    foreign key Site
    foreign key Test
    startTime
    result

参数:

   listTest,
   listSite,
   listStatus

我做了一个以上面的列表返回的查询 返回表示需求交集的测试 querySet。

我现在想要查询 以相同的给定列表返回 仅测试 最后结果位于listStatus

我已经制作了一个for循环,如果我在超过5K的测试结果上使用它,则需要一分钟以上。

1 个答案:

答案 0 :(得分:1)

从您的问题来看,很难知道您在处理代码,数据库本身和查询方面的内容,所以这只是我最好的猜测。

如果您要在循环中执行查询,则会出现N + 1查询问题。从这些数据看起来就像你可以做一个连接。但是,我不太确定您的数据库结构是什么样的,或者您希望查询返回的确切内容,因此我无法为您提供SQL解决方案。我会这样说:许多数据库不会自动向外键列添加索引。因此,我建议采取以下步骤:

  1. 确保结果表中的两个外键列都已单独编入索引 。如果没有这个,加入性能将受到影响。
  2. 重写您的循环,而不是对数据库执行一次查询。
  3. 数据库在处理复杂查询和返回大量数据方面效率惊人。如果您在循环中查询,则可能花费大部分时间来生成和解析SQL,并将数据与数据库进行编组。使用返回大结果的大型查询通常比重复使用返回小结果的小查询更有效。

相关问题