Mysql:varchar上的部分索引

时间:2017-03-01 12:09:48

标签: mysql indexing uuid

我想在db中进行一些索引优化。

我看到字段varchar 32上有一个索引,这是varchar 100字段的索引。

例如,varchar 32包含一个id(可能是用户ID或其他内容,如此字符串60c487df-38e8-1c79-da00-561799874092),varchar 100包含短字符串,如pluto或pippo。 (我知道,这个领域必须缩小)

第一个问题)对于这些字段,删除索引并创建部分索引是否正确?

例如,将varchar 32上的索引大小减小到前8个char,帮助mysql找到更快的行? (分析较小的指数)。 有缺点吗?

第二个问题)字段x varchar 100有一个完整的索引(不是部分),当我添加一个x =“pippo”的行时mysql如何工作? Mysql会填充(或保留)该列索引的所有100个字节吗?

提前致谢。

2 个答案:

答案 0 :(得分:2)

我怀疑是否有任何理由进一步“优化”您的索引。减小索引中字段的大小会减小索引的大小。但是,除非您处于内存受限的环境中,否则它们只会增加不必要的复杂性。

部分索引不允许MySQL“更快地找到行”。只比较前8个字节不足以找到一行,因此MySQL必须做更多工作才能找到给定的行。

varchar()数据类型是不同的长度字符字段。这意味着它只存储字符串中的数据,加上第一个字节或第一个字节的长度。无论值是在表中还是在索引中,都是如此。

如果性能有问题,您应该保留所拥有的索引并寻找其他方法来优化您的系统。

答案 1 :(得分:1)

  • 前缀索引只会因索引较小而有所帮助。但是如果重要的话,你就会失去独特性。通常前缀索引是无用的;提防。
  • UUID的固定长度为36个字符,不是32个字符,也不是100个字符。
  • 由于你有1型UUID,你可以重新排列这些位以按时间顺序排列,从而可能提供更好的“参考局部”。见下面的链接。
  • 将36个字符打包成16个字节可以节省大量空间。这导致更好的可缓存性(特别是对于大型表),因此速度更快。见链接。

Link