CREATE INDEX

前提条件

创建索引之前,请确保相关的Tag或Edge type已经创建。如何创建Tag和Edge type,请参见CREATE TAGCREATE EDGE

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

使用索引必读

索引的概念和使用限制都较为复杂。索引配合LOOKUPMATCH语句使用。

CREATE INDEX语句用于对Tag、EdgeType或其属性创建原生索引。通常分别称为“Tag索引”、“Edge type索引”和“属性索引”。

  • Tag索引和Edge type索引应用于和Tag、Edge type自身相关的查询,例如用LOOKUP查找有Tag player的所有点。

  • “属性索引”应用于基于属性的查询,例如基于属性age找到age == 19的所有的点。

如果已经为Tag T的属性A建立过属性索引i_TA,索引之间的可替代关系如下(Edge type索引同理):

  • 查询引擎可以使用i_TA来替代i_T

  • MATCH语句中i_T不能替代i_TA用于属性查找。

  • LOOKUP语句中i_T可能替代i_TA用于属性查找。

使用替代索引进行查询虽然能获得相同的结果,但查询性能会根据选择的索引有所区别。

如果必须使用索引,通常按照如下步骤:

  1. 初次导入数据至Nebula Graph。

  2. 创建索引。

  3. 重建索引

  4. 使用LOOKUPMATCH语句查询数据。不需要(也无法)指定使用哪个索引,Nebula Graph会自动计算。

语法

  1. CREATE {TAG | EDGE} INDEX [IF NOT EXISTS] <index_name> ON {<tag_name> | <edge_name>} ([<prop_name_list>]) [COMMENT = '<comment>'];
参数说明
TAG | EDGE指定要创建的索引类型。
IF NOT EXISTS检测待创建的索引是否存在,只有不存在时,才会创建索引。
<index_name>索引名。索引名在一个图空间中必须是唯一的。推荐的命名方式为i_tagName_propName。索引名称由大小写英文字母、数字或下划线组成,区分大写小,且不可使用关键字和保留字
<tag_name> | <edge_name>指定索引关联的Tag或Edge名称。
<prop_name_list>变长字符串属性创建索引时,必须用prop_name(length)指定索引长度;为Tag或Edge type本身创建索引时,忽略<prop_name_list>
COMMENT索引的描述。最大为256字节。默认无描述。

创建Tag/Edge type索引

  1. nebula> CREATE TAG INDEX player_index on player();
  1. nebula> CREATE EDGE INDEX follow_index on follow();

为Tag或Edge type创建索引后,用户可以使用 LOOKUP 语句查找带有该Tag的所有点的VID,或者所有该类型的边对应起始点VID、目的点VID、以及rank。详情请参见LOOKUP

创建单属性索引

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

上述示例是为所有包含Tagplayer的点创建属性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);

创建复合属性索引

复合属性索引用于查找一个Tag(或者Edge type)中的多个属性(的组合)。

  1. nebula> CREATE TAG INDEX player_index_1 on player(name(10), age);
  1. # 为Tag t的前三个属性创建复合属性索引。
  2. nebula> CREATE TAG INDEX example_index ON t(p1, p2, p3);
  3. # 注意:无法匹配到索引,因为不是从p1开始。
  4. nebula> LOOKUP ON t WHERE p2 == 1 and p3 == 1;
  5. # 可以匹配到索引。
  6. nebula> LOOKUP ON t WHERE p1 == 1;
  7. # 可以匹配到索引,因为p1和p2是连续的。
  8. nebula> LOOKUP ON t WHERE p1 == 1 and p2 == 1;
  9. # 可以匹配到索引,因为p1、p2、p3是连续的。
  10. nebula> LOOKUP ON t WHERE p1 == 1 and p2 == 1 and p3 == 1;