创建索引之前,请确保相关的Tag或Edge type已经创建。如何创建Tag和Edge type,请参见CREATE TAG和CREATE EDGE。
如何创建全文索引,请参见部署全文索引。
索引的概念和使用限制都较为复杂。索引配合LOOKUP
和MATCH
语句使用。
CREATE INDEX
语句用于对Tag、EdgeType或其属性创建原生索引。通常分别称为“Tag索引”、“Edge type索引”和“属性索引”。
-
Tag索引和Edge type索引应用于和Tag、Edge type自身相关的查询,例如用
LOOKUP
查找有Tagplayer
的所有点。 -
“属性索引”应用于基于属性的查询,例如基于属性
age
找到age == 19
的所有的点。
如果已经为Tag T
的属性A
建立过属性索引i_TA
,索引之间的可替代关系如下(Edge type索引同理):
-
查询引擎可以使用
i_TA
来替代i_T
。 -
在
MATCH
语句中i_T
不能替代i_TA
用于属性查找。 -
在
LOOKUP
语句中i_T
可能替代i_TA
用于属性查找。!!! compatibility "历史版本兼容性"
在此前的版本中,`LOOKUP`语句中的Tag或Edge type索引不可替代属性索引用于属性查找。
使用替代索引进行查询虽然能获得相同的结果,但查询性能会根据选择的索引有所区别。
!!! caution
不要任意在生产环境中使用索引,除非很清楚使用索引对业务的影响。索引会导致写性能下降90%甚至更多。
索引并不用于查询加速。只用于:根据属性定位到点或边,或者统计点边数量。
长索引会降低Storage服务的扫描性能,以及占用更多内存。建议将索引长度设置为和要被索引的最长字符串相同。索引长度最长为255,超过部分会被截断。
如果必须使用索引,通常按照如下步骤:
!!! Note
如果先创建索引再导入数据,会因为写性能的下降导致导入速度极慢。
日常增量写入时保持 `--disable_auto_compaction = false`。
新创建的索引并不会立刻生效。创建新的索引并尝试立刻使用(例如`LOOKUP`或者`REBUILD INDEX`)通常会失败(报错`can't find xxx in the space`)。因为创建步骤是异步实现的,Nebula Graph要在下一个心跳周期才能完成索引的创建。可以使用如下方法之一:
- 在[`SHOW TAG/EDGE INDEXES`](2.show-native-indexes.md)语句的结果中查找到新的索引。或者,
- 等待两个心跳周期,例如20秒。如果需要修改心跳间隔,请为[所有配置文件](../../5.configurations-and-logs/1.configurations/1.configurations.md)修改参数`heartbeat_interval_secs`。
!!! danger
创建索引,或者删除并再次创建同名索引后,必须`REBUILD INDEX`。否则无法在`MATCH`和`LOOKUP`语句中返回这些数据。
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字节。默认无描述。 |
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 player_index_0 on player(name(10));
上述示例是为所有包含Tagplayer
的点创建属性name
的索引,索引长度为10。即只使用属性name
的前10个字符来创建索引。
# 变长字符串需要指定索引长度。
nebula> CREATE TAG var_string(p1 string);
nebula> CREATE TAG INDEX var ON var_string(p1(10));
# 定长字符串不需要指定索引长度。
nebula> CREATE TAG fix_string(p1 FIXED_STRING(10));
nebula> CREATE TAG INDEX fix ON fix_string(p1);
nebula> CREATE EDGE INDEX follow_index_0 on follow(degree);
复合属性索引
用于查找一个Tag(或者Edge type)中的多个属性(的组合)。
nebula> CREATE TAG INDEX player_index_1 on player(name(10), age);
!!! caution
不支持跨Tag或Edge type创建复合索引。