精通Neo4j
上QQ阅读APP看书,第一时间看更新

3.5 索引

3.5.1 简介

数据库索引是为了提升搜索效率而创建的某些数据的特殊冗余,以额外的存储空间和写操作为代价。确定索引数据的范围,是一项重要且有一定难度的工作。Neo4j的索引由DBMS管理和更新,一旦创建并生效,Neo4j将自动选择并使用。

3.5.1.1 索引类型

Neo4j支持以下类型的索引:

● b树索引(b-tree):Cypher可以为拥有指定标签的所有节点,或拥有指定关系类型的所有关系,建立基于单个或多个属性的b树索引。基于给定标签或关系类型在单个属性上创建的索引称为单属性索引。基于给定标签或关系类型在多个属性上创建的索引称为复合索引。

● 全文索引(fulltext):详见3.6节。

● 查找索引(lookup):查找索引只依赖节点标签或关系类型,不考虑属性。

● 文本索引(text):文本索引是一种单属性索引,但只能用于字符串类型的属性。如果节点的标签或关系的关系类型不是字符串型,则这些节点和关系就不能被索引。

3.5.1.2 索引使用建议

使用索引有如下建议:

● 创建索引时明确其名称。如果没有命名,则数据库会为索引会自动生成名称。

● 索引的名称必须在索引和约束中同时保持唯一。

● 默认情况下,索引不能重复创建,两次创建相同的索引会报错。使用IF NOT EXISTS子句可以避免这种报错。

3.5.1.3 复合索引

复合b树索引同单属性b树索引一样,能支持所有的判断式:

● 等值判断:n.prop = value。

● 列表成员判断:n.prop IN list。

● 存在判断:n.prop IS NOT NULL。

● 范围搜索:n.prop > value。

● 前缀判断:STARTS WITH。

● 后缀判断:ENDS WITH。

● 子串搜索:CONTAINS。

判断式可能会被执行计划(Execution Plan)优化为存在检查和过滤器,为了避免这种情况,判断式需要遵循以下限制规则:

● 如果有任何等值检查和列表成员判断,它们需要用于索引定义的第一个属性。

● 最多可以有一个范围判断或前缀判断。

● 可以有任意数量的存在判断式。

● 范围判断、前缀判断或存在判断后的判断式必须为存在判断。而前缀判断和子串判断总是被调整为存在判断式和过滤器,因此其后的所有判断式也被调整为存在判断式。

例如,一个索引基于标签Label(prop1,prop2,prop3,prop4,prop5,prop6)的节点而建立,其判断式如下:

因为n.prop3有一个range search判断式,所以将被规划为以下判断式和过滤器n.prop4 < 'e'和n.prop5 = true:

又如,一个索引基于标签:Label(prop1,prop2)的节点而建立,其判断式如下:

因为n.prop1有一个前缀判断式,所以将被规划为以下判断式和过滤器n.prop1 ENDS WITH 'x'和n.prop2 = false。

复合索引所有被索引的属性都需要判断式,如果只有一部分属性使用了判断式,复合索引就不能被使用。要想在这种情况下使用索引,就要在相关的属性上单独创建额外的索引。