2009-12-16 86 views
1

我想將一個數字列表和其他一些字段一起存儲到MySQL中。列表中元素的數量是動態的(一段時間它可以容納大約60個元素)如何有效地將動態列表存儲到MySQL列中?

當前我將列表存儲到varchar類型的列中,並完成以下操作。

e.g. aList = [1234122433,1352435632,2346433334,1234122464] 

在存儲時間,ALIST被coverted串如下

aListStr = str(aList) 

和讀取時間的字符串被轉換回如下列出。

aList = eval(aListStr) 

有大約1000萬行,因爲我作爲字符串存儲,它佔用很多空間。什麼是最有效的方法來做到這一點?

另外什麼應該是存儲字符串而不是數字的有效方式?

回答

2

由於您希望存儲整數,所以有效的方法是將它們存儲在INT/DECIMAL列中。

創建一個額外的表,將保存這些數字並添加一個ID列以將記錄與其他表進行關聯。

而且應該是什麼存儲字符串,而不是 號碼列表的有效途徑 ?

除了我所說的,你可以將它們轉換爲十六進制代碼,這將是非常容易的&佔用更少的空間。

請注意,大的VARCHAR可能會嚴重影響性能。 根據VARCHAR的最大大小,由於MySQL爲它們分配固定大小的內存片,所以當像sotring這樣的動作完成時,VARCHAR(2)和VARCHAR(50)很重要。 當這些切片太大而不能存儲在內存中時,MySQL會將它們存儲在磁盤上。

0

我不太擔心存儲空間,更擔心記錄檢索,即可索引性/搜索。

例如,我想象在WHERE子句中執行LIKE或REGEXP來查找列表中的單個項目將比將每個列表項目標準化到單獨表格中的行中的代價要貴很多。

但是,如果您再也不需要再次執行這些查詢這些列,那麼它就沒關係。

+0

在逗號分隔的文本字段中查找項目非常簡單。 FIND_IN_SET(num,list):) – 2009-12-16 19:52:48

1

MySQL也有一個SET類型,它的工作原理類似於ENUM,但可以容納多個項目。 當然,你必須有一個有限的列表,目前MySQL只支持多達64個不同的項目。

+0

我們不能在這裏使用SET,列表中的元素不是預定義的。 SET數據類型可以保存創建表時指定的任意數量的字符串。 – 2009-12-17 03:51:51

0

由於您使用的是關係數據庫,您應該知道在單個字段中存儲非原子值可以打破第一個標準格式。更可能的是,你應該遵循唐的建議,並將這些值保存在相關表格中。我不能肯定地說這是因爲我不知道你的問題域。很可能,爲這些數據選擇RDBMS是一個不好的選擇。

+0

我們目前使用Berkeley DB(BDB)代替MySQL。這些數據需要在不同機器上運行的服務間共享。由於BDB嵌入到應用程序中,就提供可靠的設置而言,我們被迫移動到不同服務器上的數據庫,而不是應用程序服務器以獲得可伸縮性(我們應該能夠爲每個應用程序服務器處理300 tps) – 2009-12-17 03:46:52

相關問題