【问题标题】:filter of table of two foreign keys works slow两个外键表的过滤器工作缓慢
【发布时间】:2011-10-08 18:06:00
【问题描述】:

*目前我无法添加代码,因为我不在那台计算机附近

简单模型包括:

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

我做了一个查询,返回上面的列表 返回代表需求交集的 Test 查询集。

我现在想查询
以相同的给定列表返回
测试 last 结果在listStatus

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

【问题讨论】:

  • 您应该包括模型的代码以及现在的查询,否则您收到的所有答案都只是推测性的!

标签: sql django performance database-design


【解决方案1】:

从你的问题很难知道你在处理什么,无论是在代码、数据库本身还是查询方面,所以这只是我最好的猜测。

如果您要在循环中执行查询,则会遇到 N+1 查询问题。从这些数据来看,您可以改为进行联接。但是,我不太确定您的数据库结构是什么样的,或者您希望查询返回什么,所以我不能给您一个 SQL 解决方案。我会这样说:许多数据库不会自动为外键列添加索引。因此,我会推荐以下步骤:

  1. 确保结果表上的两个外键列都被索引单独。没有这个,连接性能将会受到影响。
  2. 重写循环,改为对数据库执行一个查询。

数据库在处理复杂查询和返回大量数据方面效率惊人。如果您在循环中进行查询,您可能会花费大部分时间生成和解析 SQL,以及将数据编组到数据库和从数据库中提取数据。使用返回大结果的大查询通常比重复使用返回小结果的小查询更有效。

【讨论】:

  • 我已经添加了索引,因为 ORM 我使用了一个循环。但我想我将只使用一个 SQL 查询而不是 ORM,因为它太糟糕了。
  • ORM 有两种基本风格:无所不能和轻量级。大多数轻量级 ORM(我一直相信 Django 属于这一类)鼓励在提高性能时将 SQL 直接传递到后端。
猜你喜欢
  • 2020-06-20
  • 2011-11-04
  • 2023-02-20
  • 1970-01-01
  • 2015-08-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多