2013-03-08 67 views
1

我要創建一個表格,它的行數在1000-20000之間,而且我的字段可能會重複很多......大約60%的行將具有此值,其中每個行50-100具有共享價值。MYSQL - int或短字符串?

最近我一直關注效率,我想知道是否最好在每行上存儲這個字符串(它會在8-20個字符之間),或者創建另一個表並將它們與其代表ID來代替...因此,在此表中有約1-50行用ints替換大約300-5000個字符串?

這是一個很好的方法,或者甚至是必要的嗎?

回答

1

這是爲字符串查找表的好方法。這樣你可以在整數值上構建更高效的索引。這不是絕對必要的,但作爲一個良好的做法,我會這樣做。

1

我建議使用帶外鍵的int查找表(就像你在第二種情況中描述的那樣)。這會導致索引比索引VARCHAR小得多,因此所需的存儲空間會更小。它也應該表現得更好。

1

Avitus是對的,創建查找通常是一個很好的做法。

想一想你將使用這張表的JOIN。1000-20000行不是很多MySQL要處理的東西。如果你沒有,我不會爲查找而煩惱,只需索引列。

但是,只要你開始與其他人(同樣大小)加入表中,那就是性能損失來的地方,你可以(很可能)通過引入查找來彌補。

2

是的,在大多數情況下,這是一個很好的方法。這就是所謂的正常化,主要做了兩方面的原因:

  • 刪除重複數據
  • 避免重複實體

我無法從你的問題的原因是在你的情況是什麼出來。

兩者之間的區別在於,第一個重用的值恰好看起來相同,而第二個連接的值具有相同的含義。實際的區別在於,如果一個值發生變化會發生什麼,即如果一個記錄的值發生變化,如果值本身發生變化,所有其他記錄也會發生變化,或者應該將該記錄連接到新值其他記錄保持不變。

如果是第一個原因,那麼你會節省數據庫空間,但更新記錄會更加複雜。如果出於第二個原因,您不僅可以節省空間,還可以降低不一致的風險,因爲值只存儲在一個地方。

+0

嗯,我想避免重複加上使用更多的整數和更少的字符串「最小化」......這些字段不會經常編輯 – Colandus 2013-03-08 17:59:16