4

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

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

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

2) 将此哈希字段设为唯一索引

3) 在查询中使用 INSERT IGNORE

该解决方案是否完整、安全且最优?(在SO上找到它)

有没有更好的方法来实现这个目标?

4

2 回答 2

3

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

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

您有一个文本,您无法提前指定长度,并且可能非常长(最多 64k),您希望保持其唯一性。想象一下,将如此大量的数据拆分为单独的键,并组成一个复合索引来生成唯一性。这就是你想要做的。对于整数,这将是一个包含 16000 个整数的索引,并加入到复合索引中。

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

我强烈建议以某种方式拆分数据。这不仅使 DBMS 从合并可变长度字符块中解放出来,而且还可能提供在部分数据上生成复合键的可能性。也许您甚至可以为您的数据找到更好的存储解决方案。

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

于 2013-03-08T14:53:01.753 回答
2

它几乎完成了。有可能会与哈希发生冲突(生日悖论),因此仅 UNIQUE 索引是不够的。

您最好使用散列和比较检查以确保完全安全。

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

这可以包含在一个 INSERT 或 UPDATE TRIGGER 中——甚至可能是一个 STORED PROCEDUR 以便于检查。

查看this Stack Overflow question哈希冲突的示例。

于 2013-03-08T13:26:13.567 回答