亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如何在具有 60 個功能的 1000 萬行數據庫上加速 Django 查詢聚合?

如何在具有 60 個功能的 1000 萬行數據庫上加速 Django 查詢聚合?

慕碼人8056858 2021-11-09 15:42:16
我在 psql 中有一個數據庫表,其中包含 10,000,000 行和 60 列(功能)。我定義了一個 Django 查詢集,如下所示:MyQ=MyDataBase.objects.filter(Name='Mike', date=date(2018, 2, 11), Class='03')只有 5 行滿足上述過濾條件。但是當我嘗試類似的東西時MyQ.count() #which equals 5或者MyQ.aggregate(Sum('Score'))['Score__sum'] #which equals 61每個大約需要 3 分鐘給我結果。這不是很奇怪嗎?查詢集不應該只關注我們告訴他們關注的行,從而使生活更輕松嗎?計數 5 行或對其中一個字段求和不能花費那么長時間。我究竟做錯了什么?我也應該這樣說。我第一次在這張桌子上嘗試這段代碼時,一切都很好,可能需要 1 秒才能捕捉到結果,但現在 3 分鐘真的很煩人。從那時起,我沒有更改數據庫或代碼中的任何內容。
查看完整描述

1 回答

?
米脂

TA貢獻1836條經驗 獲得超3個贊

通常,如果您根據特定字段或字段數量過濾表,則應在這些字段上創建索引。它允許數據庫查詢規劃器在搜索/排序時采用更優化的路徑。

看起來您在問題中使用了 Postgres,因此您可以SELECT * FROM pg_indexes WHERE tablename = 'yourtable';在 psql 中運行以查看任何現有索引。

Django 可以在您的模型定義中為您創建這些索引。例如,您的模型MyDatabase可能如下所示:

class MyDatabase(models.Model):
    name = models.TextField(index=True)
    date = models.DateField(index=True)   
    class = models.TextField(index=True)

這里有更多關于在 Django 模型上創建索引的閱讀:gun.io/blog/learn-indexing-dammit


查看完整回答
反對 回復 2021-11-09
  • 1 回答
  • 0 關注
  • 204 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號