2008-11-14 63 views
39

我有一個mysql表,索引INT列將爲90%的行爲0。如果我將這些行更改爲使用NULL而不是0,那麼它們是否會被排除在索引之外,從而使索引大小縮小了90%?mysql的索引是否爲空值?

+0

優秀問題 – 2015-11-25 08:42:58

回答

5

它看起來像索引NULL也是。

當您運行此因爲MySQL會鎖定索引創建期間寫入表要小心。即使列是空的(所有空值),在大型表上構建索引可能需要一段時間。

Reference

+2

您是如何得出這個結論的?我沒有看到這個話題。 – 2008-11-14 02:12:16

+0

這是在文章底部的評論。我拿出相關部分。 – 2008-11-14 02:18:15

+5

我相信它在大型表上需要一段時間的原因是因爲MySQL必須讀取整個表格,而不是因爲它正在構建一個巨大的索引。我可能是錯的。 – 2008-11-14 02:38:19

1

不,它會繼續包括它們,但不要對這兩種情況下的後果做出太多假設。很大程度上取決於其他值的範圍(谷歌爲「基數」)。

對於這種類型的情況(即包括基於過濾器的索引中的記錄),MSSQL具有稱爲「過濾索引」的新索引類型。 dBASE類型的系統曾經有類似的功能,而且非常方便。

2

允許列爲空將爲該列的存儲需求添加一個字節。這將導致索引尺寸增加,這可能不太好。這就是說,如果很多查詢被改爲使用「IS NULL」或「NOT NULL」,它們可能比進行值比較更快。

我的直覺告訴我不爲null,但有一個答案:測試!

0

每個索引都有一個基數意味着索引了多少個不同的值。 AFAIK說索引對許多行重複相同的值是不合理的想法,但索引只會將許多行的聚集索引的重複值(對於此字段具有空值的行)重複值並保持聚集索引的引用ID意思是:每個有NULL索引字段的行浪費了一個與PK大小相同的大小(因爲這個原因,如果你有複合PK,專家建議有一個合理的PK大小)。