2009-12-04 122 views
63

這可能是一個非常愚蠢的問題,但索引數據庫表中的布爾型字段會有多大好處嗎?給定一種常見的情況,如「軟刪除」被標記爲非活動狀態的記錄,因此大多數查詢包括WHERE deleted = 0,它是否有助於讓該字段自行索引,還是應該與其他常用的索引組合使用搜索不同索引的字段?索引布爾字段

+0

可能重複[索引布爾型字段是否有任何性能增益?](http://stackoverflow.com/questions/10524651/is-there-any-performance-gain-in-indexing-a-boolean-字段) – 2016-04-13 12:14:04

+3

@AmirAliAkbari:哦!沒有!循環參考!希望S.O.不會爆炸! – Paul 2017-02-01 14:49:49

回答

51

編號

您可以搜索具有高選擇性/基數的字段。幾乎任何表格中都會刪除一個布爾字段的基數。如果有的話,它會讓你的寫入變慢(通過一個很小的數量)。

也許你會使它成爲聚集索引中的第一個字段,如果每個查詢考慮到軟刪除?

+2

想象一個擁有數千頁的大書。頁面包含單個字母,'A'或'B'和一個隨機數字。如果您在A和B頁面沒有混合但書本從A頁面開始,然後是B開始的情況下找到某個您知道它位於「A」頁面之一的隨機數字條目,您是否有好處?是的,你會..所以我猜你錯了.. – tObi 2016-09-25 12:29:43

6

我認爲這會有所幫助,特別是在涵蓋指數方面。

多少/少數當然依賴於您的數據和查詢。

你可以有各種關於索引的理論,但最終答案是由數據庫中的數據庫引擎提供的真實數據。通常你會對答案感到驚訝(或者我的理論太糟糕了)

檢查查詢的查詢計劃並確定查詢是否可以改進,或者索引是否可以改進。 這很簡單,改變指標,看看它有什麼區別

+3

+1:我沒有看到在索引列中造成的危害 – 2009-12-04 05:29:18

+2

@OMGPonies危害在於額外的寫入開銷,在擁有大量行的繁忙表上,這實際上可以降低查詢性能。只有高基數和查詢才能充分利用,這只是一個好處。 – oucil 2013-12-10 20:14:15

1

我認爲這將有助於如果你使用的是一個視圖(其中刪除= 0),你經常從這個視圖查詢。

2

我認爲如果你的布爾型字段在很多情況下會引用它們,那麼有一個單獨的表,例如DeletedPages或SpecialPages,它會有許多布爾類型字段,比如is_deletedis_hidden,is_really_deleted,requires_higher_user等等,然後你就可以加入它們。

通常情況下,這個表的大小會更小,並且通過接受連接會獲得一些優勢,特別是就代碼可讀性和可維護性而言。而對於這種類型的查詢:

select all pages where is_deleted = 1

這將是更快的把它實現的是這樣的:

select all pages where pages 
inner join DeletedPages on page.id=deleted_pages.page_id 

我想我的地方閱讀有關您需要的字段在MySQL數據庫至少有3的基數使該領域的索引工作,但請確認這一點。

+1

很難說布爾值是如此薄,我們沒有任何數據,但是會產生連接,每個查詢的工作流程都會使查詢變慢,而不是更快,特別是如果主鍵的集羣不同,每個查詢都需要deleted_pa​​ges表。 – 2009-12-04 05:51:17

16

什麼是deleted_at DATETIME列?有兩個好處。

  1. 如果你需要一個像名稱的唯一列,您可以創建和軟刪除具有相同名稱多次記錄(如果您使用deleted_at列和名稱的唯一索引)
  2. 您可以搜索爲最近刪除的記錄。

您查詢看起來是這樣的:

SELECT * FROM xyz WHERE deleted_at IS NULL 
0

如果您使用的是支持位圖索引(如Oracle)數據庫,然後在布爾列這樣的索引將有用得多比沒有。