保持TEXT字段在MySQL数据库中唯一的最佳方法

时间:2013-03-08 13:20:53

标签: mysql database performance indexing unique

我想在我的MySQL表中使TEXT字段的值唯一。

经过小规模研究后,我发现由于性能问题,每个人都不鼓励在TEXT字段上使用UNIQUE INDEX。我现在要用的是:

1)创建另一个字段以包含TEXT值的哈希值(md5(text_value))

2)使这个哈希字段为UNIQUE索引

3)在查询中使用INSERT IGNORE

此解决方案是否完整,安全且最佳? (在SO上找到它)

是否有更好的方法来实现这一目标?

2 个答案:

答案 0 :(得分:3)

正如我在评论中被问及如何解决这个问题时,我会把它写成回应。

处于这种情况表明应用程序设计存在错误。考虑一下这意味着什么。

您有一个文本,您无法提前指定长度,并且可能非常长(最多64k),您希望保持唯一性。想象一下,将这么大量的数据拆分成单独的密钥,并组成一个复合索引来生成唯一性。这就是你要做的事情。对于整数,这将是16000个整数的索引,以复合索引连接。

进一步考虑CHARACTER类型字段(CHAR,VARCHAR,TEXT)通过编码进行解释,这进一步使问题复杂化。

我强烈建议以某种方式分割数据。这不仅可以使DBMS免于合并可变长度的字符块,而且还可以为部分数据生成复合键。也许您甚至可以为您的数据找到更好的存储解决方案。

如果您有任何疑问,我建议发布表格和/或数据库结构,并解释TEXT字段包含哪些逻辑数据,以及您认为它必须是唯一的原因。

答案 1 :(得分:1)

几乎完成了。有一种机会(生日悖论)会与哈希发生冲突,因此单独使用UNIQUE索引是不够的。

你最好使用哈希和比较检查来完全安全。

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

这可以包含在INSERT或UPDATE TRIGGER中 - 或者甚至可以是STORED PROCEDUR以便于检查。

有关哈希冲突的示例,请查看this Stack Overflow question