我想在我的MySQL表中使TEXT字段的值唯一。在MySQL數據庫中保持TEXT字段唯一的最佳方式
經過小型研究後,我發現每個人都因爲性能問題而對TEXT字段使用UNIQUE INDEX感到沮喪。我想現在用的就是:
1)創建另一個字段包含文本值(MD5(TEXT_VALUE))
2)的散列使這個哈希領域獨樹一幟指數
3)使用INSERT忽略在查詢中
此解決方案是否完整,安全和最佳? (在SO上發現它)
有沒有更好的方法來實現這一目標?
我想在我的MySQL表中使TEXT字段的值唯一。在MySQL數據庫中保持TEXT字段唯一的最佳方式
經過小型研究後,我發現每個人都因爲性能問題而對TEXT字段使用UNIQUE INDEX感到沮喪。我想現在用的就是:
1)創建另一個字段包含文本值(MD5(TEXT_VALUE))
2)的散列使這個哈希領域獨樹一幟指數
3)使用INSERT忽略在查詢中
此解決方案是否完整,安全和最佳? (在SO上發現它)
有沒有更好的方法來實現這一目標?
差不多完成了。有一個機會(生日悖論)會發生與散列的衝突,因此單獨使用UNIQUE索引是不夠的。
你最好使用散列和比較檢查來完全安全。
SELECT COUNT(*) FROM table
WHERE md5hash = MD5(text)
AND textvalue = text
這可以被包裹成一個INSERT或UPDATE觸發器 - 或者甚至爲便於檢查存儲再修改。
查看this Stack Overflow question
查看散列衝突的示例。
正如我在評論中被問到我會如何解決這個問題,我會寫它作爲迴應。
在這種情況下,應用程序設計中會出現錯誤。考慮這意味着什麼。
你有一個文本,你不能提前指定長度,哪一個可以是非常長的(高達64K),其中你想保持唯一性。想象一下如此大量的數據拆分成單獨的鍵,並組合一個複合索引來生成唯一性。這就是你想要做的。對於整數,這將是一個16000個整數的索引,並加入一個複合索引。
進一步考慮CHARACTER類型字段(CHAR,VARCHAR,TEXT)通過編碼進行的深層解釋,這進一步複雜化了這個問題。
我強烈建議以某種方式分割數據。這不僅可以使DBMS免受可變長度字符塊的影響,而且還可以爲部分數據生成複合鍵。也許你甚至可以爲你的數據找到更好的存儲解決方案。
如果您有任何疑問,我建議發佈表格和/或數據庫結構,並解釋TEXT字段包含的邏輯數據,以及爲什麼您認爲它需要是唯一的。
使用'VARCHAR(32)'或'CHAR(32)' 請參閱其他主題:http://stackoverflow.com/questions/247304/mysql-what-data-type-to-use-for-hashed-密碼字段和什麼長度你可以使這個領域獨特和任何你想要的。 – JoDev 2013-03-08 13:24:03
@JoDev謝謝 – 2013-03-08 13:26:22
似乎是一個很好的觸發任務。請參閱http://dev.mysql.com/doc/refman/5.0/en/create-trigger.html – Ghigo 2013-03-08 13:27:03