2013-07-10 32 views
1

我有一個在線表格,用戶必須提交幾個選擇題答案,並且可以選擇插入他們的電子郵件地址(保持最新的結果)。但是,只有很少人真正做到這一點。在MySQL中最有效的方式來存儲幾乎總是NULL的VARCHAR?

所以目前我有一張3列的表格:submission_id INT,encoded_answers varchar(20)email VARCHAR(50)。但是,考慮到95%的電子郵件條目是NULL,這是非常浪費的。

當然我可以使用兩個表格:一個是submission_idencoded_answers,另一個是submission_idemail。但是,在1個表中還有解決方案嗎?對稀疏類型的列進行排序,如果該字段不是NULL,那隻會佔用空間?

+0

爲什麼迴避正常化?多表方法是正確的。 – Yahel

+1

電子郵件的長度爲50對我來說似乎相當危險...... – Sebas

+0

很奇怪,您沒有用戶類型的記錄來表示其中包含有問題的電子郵件地址。 – tadman

回答

6

爲什麼是浪費?你有沒有做過任何測試來證實這一點?沒有值的列實際上不佔用太多空間,可能每行每列一個字節。這就是VARCHAR的全部,可變長度。

此外,任意限制您的字段爲短長度實際上被認爲是有害的。電子郵件地址超過50個字符並不罕見。請注意,對於長度相等的字符串,VARCHAR(50)VARCHAR(255)的存儲要求是相同的。它只適用於長度爲256或更長的列,您將以額外的長度字節形式付款。

請記住,如果數據不適合字段,MySQL將任意截斷數據。這對於電子郵件地址等重要數據來說確實是不好

+0

非常有用的建議,似乎我誤解了這一點。謝謝! – user1111929

+2

是的,varchar(50)中的字符串存儲與varchar(255)中的相同字符串相同。但是,當字符串從存儲引擎加載到內存中時,字符串必須以固定長度的行存儲在內存中,因此RAM將根據列的最大長度進行分配。這是用於排序和臨時表格的格式,這些緩衝區可以後臺到磁盤。因此,爲不需要長度的字符串定義varchar(255)可能會浪費,甚至會浪費您的可用磁盤空間。 –

+0

我已經使用MySQL很長一段時間了,我從來沒有遇到'VARCHAR(50)'節省了一天的問題。你所說的技術上是真實的,但除非你處理**保證**的數據是特定長度的數據,例如ISO國家/地區代碼,SHA型哈希或受到應用程序級長度要求的數據,它是最好是更寬容一些,默認使用'255'。如果你正在處理數十億個電子郵件地址,那麼適當的規範化將在這裏支付更多的紅利,而不是更短的時間。 「INT」是4個字節。如果是UTF-8,'VARCHAR(50)'是150。 – tadman

0

不在SQL,no。你應該考慮使用一個NoSQL引擎來完成這樣的任務。

相關問題