【问题标题】:How does MySQL handle compound unique indexes with limited lengths?MySQL 如何处理长度有限的复合唯一索引?
【发布时间】:2011-08-20 04:01:25
【问题描述】:

假设 MySQL (MyISAM) 表中有两列:

title VARCHAR(1500)
url VARCHAR(155)

我想在两列上创建一个复合唯一索引。我知道 limiting length 功能对于太长的列(例如我的 title 列)。它如何与复合索引一起使用?

我想要的是这样的:

|--- url_value ---| + |--- title_value ---|
|--------155------| + |--------rest-------| <-- This should be the key length

我的意思是密钥应该有最大长度(我使用 utf8 作为编码,所以对于唯一索引,我限制为每列允许 333 个字符),其中 url 列的所有 155 个字符和 @ 列的 178 个字符987654325@ 应该在唯一索引中得到尊重。对不起英语不好。我尽量解释清楚。如果它看起来令人困惑,请多多包涵,如有必要,我很乐意提供更多信息。

【问题讨论】:

    标签: mysql unique compound-key


    【解决方案1】:

    我不确定您的问题是什么,所以这可能无法真正回答,但是对于这样的长字段强制唯一性的一种选择是使用 MD5 对长字段的哈希强制执行唯一约束,或任何其他适合您需要的散列算法。所以...

    title VARCHAR(1500)
    url VARCHAR(155)
    title_md5 VARCHAR(16)
    

    您可以创建一个触发器,在每次更新 title 时自动填充 title_md5。然后你把你的唯一索引放在(url,title_md5)

    当然,这有一些缺点。实际表中有更多开销——尽管其中大部分可以通过更小/更有效的索引来抵消。此外,索引title_md5 并不能更快地搜索实际的title 列,因此如果您需要对其进行搜索,您可能需要在title 上创建一个“重复”索引。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-06-26
      • 1970-01-01
      • 1970-01-01
      • 2015-03-03
      • 1970-01-01
      • 2015-03-26
      • 1970-01-01
      相关资源
      最近更新 更多