用于创建具有特定密钥长度的索引的启发式算法?

时间:2014-10-03 14:44:47

标签: mysql database postgresql indexing rails-models

我刚刚了解到某些数据库可以指定一个索引长度,如果我理解正确,则只索引字段中的第一个 n 字符。

何时应指定索引前缀长度?什么是好长度?

我在Rails中使用PostgreSQL,但此信息应足以应用于其他DBMS。

根据http://apidock.com/rails/ActiveRecord/ConnectionAdapters/SchemaStatements/add_index

add_index(:accounts, :name, name: 'by_name', length: 10)

产生

CREATE INDEX by_name ON accounts(name(10))

不幸的是,该页面没有提及任何有关索引长度的内容。

1 个答案:

答案 0 :(得分:0)

MySQL page on CREATE INDEX syntax提供了更多信息。

  

可以创建仅使用列值的前导部分的索引。

使用与上面类似的示例:

  

如果列中的名称通常在前10个字符中不同,则此索引不应比从整个name列创建的索引慢得多。

措辞有点令人困惑,但我认为如果你指定索引前缀长度为10,前10个字符通常足够独特,那么这个较短的索引可能比一个完整的索引,但如果不是那么多。

我不会认为他们的意思是"这个指数应该不会慢得多,而且这就是它所说的。我想它会更快,因为它操作的字符较少,但速度不快。

一些更有用的信息:

  

此外,使用索引的列前缀可以使索引文件更小,这可以节省大量磁盘空间,还可以加快INSERT操作。

所以你可能会有一个较小的索引文件和更快的INSERT。

  

UNIQUE索引创建一个约束,使索引中的所有值必须是不同的。 [...]如果为UNIQUE索引中的列指定前缀值,则列值必须在前缀中唯一。

如果可以保证前缀中的值是唯一的,则只应为唯一索引指定索引长度。

至于什么样的长度...很难回答,也许其他人也可以插话。我认为足够短的长度可以获得更小的索引文件大小和更快的好处操作,但足够长,前缀中的值很有可能是唯一的(或者如果你也使用唯一索引,则保证是唯一的)。