【问题标题】:MySQL VARCHAR index truncated to 255 during migrationMySQL VARCHAR 索引在迁移期间被截断为 255
【发布时间】:2015-01-08 17:39:33
【问题描述】:

我对在这种情况下会发生什么感到有些困惑。我们在 SQL Server 中有一个列,例如 VARCHAR(500)。迁移工具 ( MySQL Workbench ) 将索引截断为 255。我发现的另一个 post 以及 Google 上的许多其他地方表明 255 是基于 VARCHAR 的索引的限制。从这个post here,我看到它是前 255 个字符。但我对这在实际实践中的效果感到有点困惑。换句话说,如果运气不好,我正在寻找一个在实际列中 255 点之后的子字符串(使用“like”子句),会发生什么?或者如果我使用“=”、“>”等比较列,但在比较字符串中使用超过 255 个,会发生什么情况。在这种棘手的情况下,它只是忽略索引还是什么?

对 MySQL 有点陌生,多年来一直在使用 SQL Server,所以只是想了解会发生什么。谢谢。

【问题讨论】:

    标签: mysql


    【解决方案1】:

    限制是按字节应用的,InnoDB 的限制是 767。所以 255 个字符是 UTF8 的限制(MySQL 的 UTF8 实现只支持最多 3 个字节的字符)。如果是单字节字符集,你的索引显然可以更大。

    如果列大于索引,则使用索引将永远找不到精确匹配,并且必须进行一些表扫描,尽管它会使用索引来接近范围。

    LIKE 和其他比较运算符仍然可以正常工作。它们可能只是性能较差。

    【讨论】:

    • 谢谢。如果“like”子字符串在前 255 个字符之外会发生什么情况,例如“column like '%FUN%'”,其中“FUN”子字符串不在前 255 个字符中。在这种情况下它会返回不匹配的行,还是会进行表扫描?
    • 使用LIKE '%FUN%',无论索引大小如何,它都无法使用索引,而只是进行表扫描。在这种情况下,索引限制甚至无关紧要。也许你想要一个 FULLTEXT 索引?
    • 谢谢,我现在知道了。我有点忘记了这样的“喜欢”语句无论如何都不能使用索引,但现在我想起来了。
    猜你喜欢
    • 2017-09-05
    • 1970-01-01
    • 1970-01-01
    • 2011-08-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-30
    • 1970-01-01
    相关资源
    最近更新 更多