CREATE INDEX

CREATE INDEX语句可以为现存的标签、边类型或属性创建原生索引。

大多数图查询都是从属性标识的点或边的列表开始检索的。索引可以让大规模图数据库的全局检索更加高效。

说明:如何创建全文索引,请参见部署全文索引

前提条件

创建索引之前,请确保相关的标签或边类型已经创建。如何创建标签和边类型,请参见CREATE TAGCREATE EDGE

使用索引必读

正确使用索引可以加速查询,但是索引会导致写性能下降90%甚至更多,只有在根据点或边的属性定位点或边时才使用索引。请不要随意在生产环境中使用索引,除非您很清楚使用索引对业务的影响。

如果您必须使用索引,建议您按照如下步骤:

  1. 导入数据至Nebula Graph。

  2. 创建索引。

  3. 重建索引

  4. 使用LOOKUPMATCH语句查询数据。

  • 先创建索引再导入数据,会因为写性能的下降导致导入速度极慢。

  • 创建索引后,您必须为已存在的数据重建索引,否则不能索引已存在的数据,导致无法在MATCHLOOKUP语句中返回这些数据。

  • 您不需要指定使用哪个索引,Nebula Graph会自动计算。

语法

  1. CREATE {TAG | EDGE} INDEX [IF NOT EXISTS] <index_name> ON {<tag_name> | <edge_name>} ([prop_name_list]);
  • index_name:索引名。索引名在一个图空间中必须是唯一的。推荐的命名方式为i_tagName_propName

  • IF NOT EXISTS:检测待创建的索引是否存在,只有不存在时,才会创建索引。

  • prop_name_list:

    • 变长字符串属性创建索引时,必须用prop_name(length)指定索引长度。

      说明:长索引会降低Storage服务的扫描性能,以及占用更多内存。建议您将索引长度设置为和要索引的最长字符串相同。索引长度最长为255,超过部分会被截断。

    • 定长字符串属性创建索引时,使用prop_name设置要索引的属性即可,索引长度为字符串长度。

    • 为标签或边类型本身创建索引时,请忽略prop_name_list

      禁止:如果您已经为标签或边类型中的任何属性创建了索引,请不要再为标签或边类型本身创建索引。

创建索引说明

尝试使用新创建的索引可能会失败,因为创建是异步实现的。

Nebula Graph将在下一个心跳周期内完成索引的创建,为了确保创建成功,可以使用如下方法之一:

  • SHOW TAG/EDGE INDEXES语句的结果中查找新的索引,如果找不到,请等待几秒重试。

  • 等待两个心跳周期,例如20秒。

如果需要修改心跳间隔,请为所有配置文件修改参数heartbeat_interval_secs

创建标签/边类型索引

  1. nebula> CREATE TAG INDEX player_index on player();
  1. nebula> CREATE EDGE INDEX like_index on like();

为标签或边类型创建索引后,您可以使用LOOKUP语句检索带有标签的所有点的ID,或者起始点ID、目的点ID,以及带有边类型的所有边的rank。详情请参见LOOKUP

创建单个属性索引

  1. nebula> CREATE TAG INDEX player_index_0 on player(name(10));

上述示例是为所有包含标签player的点创建属性name的索引,索引长度为10,即使用属性name的前10个字符创建索引。

  1. # 变长字符串需要指定索引长度。
  2. nebula> CREATE TAG var_string(p1 string);
  3. nebula> CREATE TAG INDEX var ON var_string(p1(10));
  4. # 定长字符串不需要指定索引长度。
  5. nebula> CREATE TAG fix_string(p1 FIXED_STRING(10));
  6. nebula> CREATE TAG INDEX fix ON fix_string(p1);
  1. nebula> CREATE EDGE INDEX follow_index_0 on follow(degree);

创建复合属性索引

多个属性上的索引称为复合索引。

说明:不支持跨标签或边类型创建复合索引。

  1. nebula> CREATE TAG INDEX player_index_1 on player(name(10), age);