2010-11-02 175 views
2

我正在使用python/django作爲編程語言/框架。我需要知道的是完全關於postgresql和索引...postgresql索引使用 - 加號和減號

對於那些使用django可能知道內容類型和Django管理日誌。但很快,管理員日誌正在記錄用戶操作。我也用它來記錄網站內執行的所有操作。所以它有1.000.000+的記錄。我使用SQL查詢來篩選結果,多數民衆贊成在這裏...

問題是,我使用兩個字段從不同的表中選擇數據。其中之一是內容類型,它存儲相關的數據庫表信息和字段索引...

其他字段是,對象id,它存儲相關對象的id,字段類型是varchar和字段是未編入索引...

使用的Examle是:

Select from django_admin_log where content_type_id=15 and object_id="12343545"; 

由於content_type_id = 15分我blog_texts表和相關對象的ID是12343545,我可以很容易地取得相關資料...

但是object_id沒有索引,而table有1 .000.000+記錄,像我上面寫的查詢需要大量的執行時間。

在object_id中使用索引有哪些好處和缺點。這些好處是否會比弊端大?

更新:我沒有更新管理日誌表。它只記錄所有用戶操作... 40.000-45.000記錄每天插入到表中。系統在一天中的2/3,大約15-16小時(早上到傍晚)期間真的很忙。因此,在上午8點到下午11點期間插入45.000條記錄...

因此,從這個角度來看,如果我創建索引,是否會導致數據庫過度過載?

更新2:還有一個問題。另一張帶有布爾型字段的2.000.000+記錄表。字段類似於「將其顯示」,並且與其他過濾標準一起使用。爲這樣的布爾型字段創建索引是合乎邏輯的。

二conditin是,與1.000.000記錄的表索引的布爾和日期時間字段一起...

使用索引,這兩個條件是一個好主意或沒有?

回答

1

只是爲了澄清....

對於這個特殊的SQL,你應該使用一個指數包括兩列(content_type_idobject_id) - 級聯指數。

在這種情況下,您只能刪除content_type_id上的現有索引 - 新索引將能夠服務器僅查詢content_type_id的查詢以及查詢兩列均被過濾的查詢。

兩個索引 - 現有的索引和僅限於object_id的新索引 - 可能不會爲此查詢提供最佳結果。

編輯:如果您擴展現有索引object_id列,插入的性能損失將可以忽略不計,但您的選擇將工作得更快。

編輯2:如果你有這樣的

WHERE bool = true 

等一個這樣的語句:

WHERE bool = true AND date > something 

我建議在BOOL的級聯指數第一,然後日期。

與不等式比較一起使用的列應移向索引的末尾。

但是,根據您的數據,可能不會索引BOOL字段。例如如果95%的所有行都爲真,上述語句不會過濾得太多。在這種情況下,索引可能會降低select語句的性能。但是,一個好的優化器會忽略索引。仍然會有插入/更新/刪除成本。


瞭解更多關於concatenated indexes in my free eBook

+0

感謝您的回覆,quesstion更新... – FallenAngel 2010-11-02 12:44:38

+0

再次更新... – FallenAngel 2010-11-02 14:20:37

1

在object_id中使用索引的好處和缺點是什麼?

好處是查詢速度會更快。缺點是插入速度會變慢。

效益是否大於弊端?

我敢說是的,他們會這樣做,因爲谷歌廣告收入來自更快的頁面加載量的增加肯定會值得您在發佈博客條目時必須等待的額外秒數。

更新:

從您的文章我可以斷定,該表在高峯時段接收約4條每秒。

4記錄1M表中的第二個對於任何體面的服務器都不是問題,所以我相信你可以安全地創建索引。

(object_id, content_type_id)上創建組合索引會更好。

+0

要添加到Quassnoi的答案,你也將在一般情況下更新UPDATES,但看看你的情況,我懷疑object_id會得到更新。看看你的情況,唯一受到INSERTS和UPDATES影響的是你,所以看起來好像是一個安全的選擇,讓你的用戶有足夠的速度。 – 2010-11-02 11:41:12

+0

感謝您的回覆,quesstion更新... – FallenAngel 2010-11-02 12:43:28

+0

再次更新... – FallenAngel 2010-11-02 13:39:02