2013-03-08 143 views
3

我想在我的MySQL表中使TEXT字段的值唯一。在MySQL數據庫中保持TEXT字段唯一的最佳方式

經過小型研究後,我發現每個人都因爲性能問題而對TEXT字段使用UNIQUE INDEX感到沮喪。我想現在用的就是:

1)創建另一個字段包含文本值(MD5(TEXT_VALUE))

2)的散列使這個哈希領域獨樹一幟指數

3)使用INSERT忽略在查詢中

此解決方案是否完整,安全和最佳? (在SO上發現它)

有沒有更好的方法來實現這一目標?

+1

使用'VARCHAR(32)'或'CHAR(32)' 請參閱其他主題:http://stackoverflow.com/questions/247304/mysql-what-data-type-to-use-for-hashed-密碼字段和什麼長度你可以使這個領域獨特和任何你想要的。 – JoDev 2013-03-08 13:24:03

+0

@JoDev謝謝 – 2013-03-08 13:26:22

+1

似乎是一個很好的觸發任務。請參閱http://dev.mysql.com/doc/refman/5.0/en/create-trigger.html – Ghigo 2013-03-08 13:27:03

回答

1

差不多完成了。有一個機會(生日悖論)會發生與散列的衝突,因此單獨使用UNIQUE索引是不夠的。

你最好使用散列和比較檢查來完全安全。

SELECT COUNT(*) FROM table 
WHERE md5hash = MD5(text) 
AND textvalue = text 

這可以被包裹成一個INSERT或UPDATE觸發器 - 或者甚至爲便於檢查存儲再修改。

查看this Stack Overflow question查看散列衝突的示例。

+0

請記住,如果字符串是遵循一些限制性規則(例如那些定義自然語言的規則)的有意義的文本,則散列衝突的概率變得越來越小。 – eggyal 2013-03-08 14:16:05

+0

@eggyal我完全同意,非常非常小......但並非不可能。 – Steve 2013-03-08 14:18:05

3

正如我在評論中被問到我會如何解決這個問題,我會寫它作爲迴應。

在這種情況下,應用程序設計中會出現錯誤。考慮這意味着什麼。

你有一個文本,你不能提前指定長度,哪一個可以是非常長的(高達64K),其中你想保持唯一性。想象一下如此大量的數據拆分成單獨的鍵,並組合一個複合索引來生成唯一性。這就是你想要做的。對於整數,這將是一個16000個整數的索引,並加入一個複合索引。

進一步考慮CHARACTER類型字段(CHAR,VARCHAR,TEXT)通過編碼進行的深層解釋,這進一步複雜化了這個問題。

我強烈建議以某種方式分割數據。這不僅可以使DBMS免受可變長度字符塊的影響,而且還可以爲部分數據生成複合鍵。也許你甚至可以爲你的數據找到更好的存儲解決方案。

如果您有任何疑問,我建議發佈表格和/或數據庫結構,並解釋TEXT字段包含的邏輯數據,以及爲什麼您認爲它需要是唯一的。

相關問題