缺點

2013-12-20 24 views
3

閱讀documentation on indexes後,我以爲缺點

嘿,因爲(對我來說)幾乎總是執行從數據庫中讀取往往遠遠超過寫它,爲什麼不創建大多數指標表中的字段?

這是正確的態度嗎?除此之外,還有其他缺點嗎?

當然,索引將被限制在實際在SELECT語句條件中使用的字段中。

回答

5

索引有幾個缺點。
首先,它們消耗空間。這可能是無關緊要的,但如果你的表格特別大,可能會產生影響。
其次,更重要的是,您需要記住,索引在涉及新行,DELETE舊索引列或UPDATE現有索引列的值時會有性能損失,因爲現在DML語句不僅需要修改表中的數據,但也是索引的數據。再一次,這很大程度上取決於您的應用程序用例。如果DML非常罕見以至於性能不成問題,這可能不是一個考慮因素。
第三(儘管這與我的第一點緊密相關),請記住,每次創建另一個數據庫對象時,都會產生額外的維護開銷 - 這是另一個需要偶爾重建的索引,收集統計信息(取決於您使用的RDBMS,當然),另一個目標是咔噠的數據字典等。

底線全部歸結爲您的用例。如果您經常運行重要的查詢,並且可以通過此索引進行改進 - 請參閱。如果您在藍色月亮中運行此查詢一次,那麼您可能不希望減慢所有的INSERT聲明。

+1

索引*可以*加快「刪除」或「更新」語句,不僅減慢速度。 –

+1

@a_horse_with_no_name如果它有助於加速查找相關行,則爲true,則爲true。 – Mureinik

0

在讀取操作期間,有很多索引(小)性能下降:您擁有的越多,Postgres花費的時間越多,以評估哪個查詢計劃最好。

正如您正確指出的那樣,在條件中不使用的字段上使用索引沒有意義。它只會減慢插入。

請注意,在提供可疑選擇性的字段上使用索引也沒有多大意義。根據行的布爾值是否設置爲true或false,查看大致分爲兩部分的表格。如果真值和假值大部分均勻分佈,則該字段上的索引對查詢幾乎沒有好處 - 索引可能有用,因爲缺少更好的選項,如果真假行被聚集在一起。相反,如果該字段爲90%爲真,那麼對於10%的假部分索引是有用的。

最後,存在存儲問題:每個索引佔用空間。有時(特別是GIN)比索引數據多幾倍。