跳转至

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用于属性查找。

    历史版本兼容性

    在此前的版本中,LOOKUP语句中的 Tag 或 Edge type 索引不可替代属性索引用于属性查找。

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

Caution

不要任意在生产环境中使用索引,除非很清楚使用索引对业务的影响。索引会导致写性能下降 90%甚至更多。

索引并不用于查询加速。只用于:根据属性定位到点或边,或者统计点边数量。

长索引会降低 Storage 服务的扫描性能,以及占用更多内存。建议将索引长度设置为和要被索引的最长字符串相同。索引长度最长为 256。

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

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

  2. 创建索引。

  3. 重建索引

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

Note

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

日常增量写入时保持 --disable_auto_compaction = false

新创建的索引并不会立刻生效。创建新的索引并尝试立刻使用(例如LOOKUP或者REBUILD INDEX) 通常会失败(报错can't find xxx in the space)。因为创建步骤是异步实现的,Nebula Graph 要在下一个心跳周期才能完成索引的创建。为确保数据同步,后续操作能顺利进行,请等待 2 个心跳周期(20 秒)。如果需要修改心跳间隔,请为所有配置文件修改参数heartbeat_interval_secs

Danger

创建索引,或者删除并再次创建同名索引后,必须REBUILD INDEX。否则无法在MATCHLOOKUP语句中返回这些数据。

语法

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。索引名称以英文字母开头,支持 1~4 字节的 UTF-8 编码字符,包括英文字母(区分大小写)、数字、中文等,但是不包括除下划线外的特殊字符。使用特殊字符或保留关键字时,需要用反引号(`)包围,详情参见关键字和保留字
<tag_name> \| <edge_name> 指定索引关联的 Tag 或 Edge 名称。
<prop_name_list> 变长字符串属性创建索引时,必须用prop_name(length)指定索引长度;为 Tag 或 Edge type 本身创建索引时,忽略<prop_name_list>
COMMENT 索引的描述。最大为 256 字节。默认无描述。

创建 Tag/Edge type 索引

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

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

创建单属性索引

nebula> CREATE TAG INDEX IF NOT EXISTS player_index_0 on player(name(10));

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

# 变长字符串需要指定索引长度。
nebula> CREATE TAG IF NOT EXISTS var_string(p1 string);
nebula> CREATE TAG INDEX IF NOT EXISTS var ON var_string(p1(10));

# 定长字符串不需要指定索引长度。
nebula> CREATE TAG IF NOT EXISTS fix_string(p1 FIXED_STRING(10));
nebula> CREATE TAG INDEX IF NOT EXISTS fix ON fix_string(p1);
nebula> CREATE EDGE INDEX IF NOT EXISTS follow_index_0 on follow(degree);

创建复合属性索引

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

nebula> CREATE TAG INDEX IF NOT EXISTS player_index_1 on player(name(10), age);

Caution

不支持跨 Tag 或 Edge type 创建复合索引。

Note

使用复合属性索引时,遵循"最左匹配原则",必须从复合属性索引的最左侧开始匹配。


最后更新: March 7, 2023