CREATE INDEX

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

    使用索引必读

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

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

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

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

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

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

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

      历史版本兼容性

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

    Caution

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

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

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

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

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

    2. 创建索引。

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

    Note

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

    新创建的索引并不会立刻生效。创建新的索引并尝试立刻使用(例如LOOKUP或者REBUILD INDEX)通常会失败(报错can't find xxx in the space)。因为创建步骤是异步实现的,Nebula Graph要在下一个心跳周期才能完成索引的创建。可以使用如下方法之一:

    • SHOW TAG/EDGE INDEXES语句的结果中查找到新的索引。或者,

    • 等待两个心跳周期,例如20秒。如果需要修改心跳间隔,请为修改参数heartbeat_interval_secs

    Danger

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

    创建Tag/Edge type索引

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

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

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

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

    创建复合属性索引

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

    Caution

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

    Note


    最后更新: November 1, 2021