2014-07-11 24 views
0
SELECT a,b,c FROM t WHERE status!="deleted" 

可能的值是「積極的」,「刪除」,「待定」等應該在SQL表中刪除狀態列<code>status</code>索引

應該status索引?請解釋爲什麼你覺得它應該或不應該。

編輯。 t將持有一堆記錄。它們會定期被刪除。而不是刪除它們,我只是添加一個名爲「狀態」的列表示它們是否被刪除。

+1

這個問題一般無法回答。它取決於數據,使用方法,需求等。 – zerkms

+0

額外索引的成本是額外的'INSERT'時間。所以這取決於... –

+0

還不夠。平均有多少刪除的行。你將如何選擇數據。 – zerkms

回答

1

對於查詢與

WHERE status!="deleted" 

謂詞B樹(和Hash)基於索引將是無用的。僅僅因爲他們不會優化!=運營商。

所以具有覆蓋status作爲其最左邊的部分只會是有用的,如果一個索引:

  1. 您使用=比較(或IN (...)
  2. 將要選擇的行數是低(相對於總共行數)。

PS:如果以上兩項是實際情況 - 值得研究基於Hash的實際索引。

+0

+1教我一些非常有用的東西。我會刪除我的答案;-) –

+0

哎呀!這是一個大問題。我不明白B-Tree,但是,我承認你是這樣做的。所以,如果行數很高,而且我只希望顯示沒有刪除的行,我應該放棄這個策略並且可以移動它們嗎?請注意,我將對限制在相當少量的行的查詢有一個限制。不知道這是否有所作爲。 – user1032531

+0

@ user1032531:'LIMIT'不會改變任何東西,在這種情況下全屏掃描更容易。 – zerkms

0

如果你真的有這麼多行,一個小型的int status_id,鏈接到一個具有實際狀態的表。這樣可以節省存儲空間,提高索引效率,並且可能更有效地進行搜索,因爲它是一個整數比較而不是逐個字符的字符串比較。