假设 MySQL (MyISAM) 表中有两列:
title VARCHAR(1500)
url VARCHAR(155)
我想在两列上创建一个复合唯一索引。我知道过长列(如我的 title
列)的限制长度 功能。它如何使用复合索引?
我想要的是这样的:
|--- url_value ---| + |--- title_value ---|
|--------155------| + |--------rest-------| <-- This should be the key length
我的意思是 key 应该具有最大长度(我使用 utf8 作为编码,因此对于唯一索引,每列允许的字符数限制为 333 个),其中 url
列的所有 155 个字符和唯一索引中应考虑 title
列的 178 个字符。抱歉英语不好。我尽力解释。如果它看起来令人困惑,请耐心等待,如有必要,我很乐意提供更多信息。
最佳答案
我不太确定你的问题是什么,所以这可能无法真正回答它,但是在像这样的长字段上强制唯一性的一种选择是使用 MD5 对长字段的散列强制执行唯一约束,或任何其他适合您需要的哈希算法。所以……
title VARCHAR(1500)
url VARCHAR(155)
title_md5 VARCHAR(16)
您可以创建一个触发器,在每次 title
更新时自动填充 title_md5
。然后将唯一索引放在 (url,title_md5)
上。
当然这有一些缺点。实际表中有更多开销——尽管其中大部分可以通过更小/更有效的索引来抵消。此外,索引 title_md5
不会使搜索实际的 title
列更快,因此您可能需要对 title
进行“重复”索引,如果您需要对此进行搜索。
关于mysql - MySQL 如何处理长度有限的复合唯一索引?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7129562/