我要創建一個表格,它的行數在1000-20000之間,而且我的字段可能會重複很多......大約60%的行將具有此值,其中每個行50-100具有共享價值。MYSQL - int或短字符串?
最近我一直關注效率,我想知道是否最好在每行上存儲這個字符串(它會在8-20個字符之間),或者創建另一個表並將它們與其代表ID來代替...因此,在此表中有約1-50行用ints替換大約300-5000個字符串?
這是一個很好的方法,或者甚至是必要的嗎?
我要創建一個表格,它的行數在1000-20000之間,而且我的字段可能會重複很多......大約60%的行將具有此值,其中每個行50-100具有共享價值。MYSQL - int或短字符串?
最近我一直關注效率,我想知道是否最好在每行上存儲這個字符串(它會在8-20個字符之間),或者創建另一個表並將它們與其代表ID來代替...因此,在此表中有約1-50行用ints替換大約300-5000個字符串?
這是一個很好的方法,或者甚至是必要的嗎?
這是爲字符串查找表的好方法。這樣你可以在整數值上構建更高效的索引。這不是絕對必要的,但作爲一個良好的做法,我會這樣做。
我建議使用帶外鍵的int
查找表(就像你在第二種情況中描述的那樣)。這會導致索引比索引VARCHAR小得多,因此所需的存儲空間會更小。它也應該表現得更好。
Avitus是對的,創建查找通常是一個很好的做法。
想一想你將使用這張表的JOIN。1000-20000行不是很多MySQL要處理的東西。如果你沒有,我不會爲查找而煩惱,只需索引列。
但是,只要你開始與其他人(同樣大小)加入表中,那就是性能損失來的地方,你可以(很可能)通過引入查找來彌補。
是的,在大多數情況下,這是一個很好的方法。這就是所謂的正常化,主要做了兩方面的原因:
我無法從你的問題的原因是在你的情況是什麼出來。
兩者之間的區別在於,第一個重用的值恰好看起來相同,而第二個連接的值具有相同的含義。實際的區別在於,如果一個值發生變化會發生什麼,即如果一個記錄的值發生變化,如果值本身發生變化,所有其他記錄也會發生變化,或者應該將該記錄連接到新值其他記錄保持不變。
如果是第一個原因,那麼你會節省數據庫空間,但更新記錄會更加複雜。如果出於第二個原因,您不僅可以節省空間,還可以降低不一致的風險,因爲值只存儲在一個地方。
嗯,我想避免重複加上使用更多的整數和更少的字符串「最小化」......這些字段不會經常編輯 – Colandus 2013-03-08 17:59:16