【问题标题】:Best way to use Index in Django and PostgreSQL在 Django 和 PostgreSQL 中使用索引的最佳方法
【发布时间】:2021-01-14 14:45:45
【问题描述】:

我正在使用 Python、Django 和 PostgreSQL 进行应用程序开发。我的数据库有数百万条记录,我必须使用这些数据实时(运行时)生成报告。在生成这些报告时,应用程序会超时并且无法生成报告。如果数据在 50k 左右,它正在生成一个 excel 文件,但是当数据为数百万时,查询将无法运行。

通过 Django Model 或 PostgreSQL Index 实现 Index 的最佳方式是什么?

请帮助我优化查询以使其更快。

版本

PostgreSQL 13.1,由 Visual C++ build 1914 编译,64 位


    EXPLAIN (ANALYZE,BUFFERS) 
SELECT
    V."MERCHANT_ID",
    V."ACCOUNT_NUMBER",
    V."GIFT_LIST_REF",
    ( SELECT "store_id" FROM vd_store_master WHERE "store_id" = V."GIFT_LIST_REF" ) AS owingin_store_id,
    ( SELECT "store_name" FROM vd_store_master WHERE "store_id" = V."GIFT_LIST_REF" ) AS owingin_store_name,
    ( SELECT "franchisee_id" FROM vd_store_master WHERE "store_id" = V."GIFT_LIST_REF" ) AS owingin_franchisee_id,
    ( SELECT "franchisee_name" FROM vd_franchisee WHERE "franchisee_id" = ( SELECT "franchisee_id" FROM vd_store_master WHERE store_id = V."GIFT_LIST_REF" ) ) AS owingin_franchisee_name,
    ( SELECT "merchant_name" FROM vd_merchant_master WHERE merchant_id = V."MERCHANT_ID" ) AS merchant_name 
FROM
    vdaccount_card_assign V 
WHERE
    "MERCHANT_ID" = '003561002966107' 
    AND "CARD_STATUS" = 'D'
    
    "QUERY PLAN"
    "Seq Scan on vdaccount_card_assign v  (cost=0.00..2056093.85 rows=149948 width=1362) (actual time=0.144..7171.425 rows=154405 loops=1)"

【问题讨论】:

  • 从 MERCHANT_ID 上的索引和与 GIFT_LIST_REF 相关的所有列开始。但是查询看起来也有点奇怪:为什么所有这些子选择?
  • 嗨,@FrankHeikens 感谢您的回复!所有这些 Sub Select 因为我们从多个表中获取数据。

标签: python django postgresql


【解决方案1】:

您是否尝试过调整 postgresql 本身?它帮助我让数据库更快地工作。 转到https://pgtune.leopard.in.ua/ 并填写您知道的所有详细信息,它将为您提供一个开始设置。

对于索引:我猜你需要在每个表上创建至少一个带有 id 的索引

也许您也可以使用 INNER JOIN 代替额外的 SELECT ?但不确定它会更快。

【讨论】:

    【解决方案2】:

    您可能想要创建多个文件并尝试使用多处理或超线程来帮助减少运行时间和工作量。将文件作为模块导入可以帮助划分工作,但会使工作更加混乱。你应该试试:

    import ex.py, ex2.py, ex3.py... # Duplicate of programs
    
    find() #example function
    

    另外,实际运行时间有多长?

    【讨论】:

      猜你喜欢
      • 2021-05-20
      • 1970-01-01
      • 1970-01-01
      • 2013-07-10
      • 1970-01-01
      • 2019-04-14
      • 2020-09-04
      • 1970-01-01
      • 2022-12-12
      相关资源
      最近更新 更多