Skip to content

CREATE INDEX

Use CREATE INDEX to add native indexes for existing tags, edge types or properties.

Note

For how to create text-based indexes, see Deploy full-text index.

Most graph queries start the traversal from a list of vertices or edges that are identified by their properties. Indexes make these global retrieval operations efficient on large graphs.

Prerequisites

Before you create an index, make sure that the relative tag or edge type is created. For how to create tags or edge types, see CREATE TAG and CREATE EDGE.

Must-read for using index

Correct use of indexes can speed up queries, but indexes can dramatically reduce the write performance. The performance reduction can be as much as 90% or even more. DO NOT use indexes in production environments unless you are fully aware of their influences on your service.

If you must use indexes, we suggest that you:

  1. Import data into Nebula Graph.
  2. Create indexes.
  3. Rebuild the indexes.

The preceding workflow minimizes the negative influences of using indexes.

Syntax

CREATE {TAG | EDGE} INDEX [IF NOT EXISTS] <index_name> ON {<tag_name> | <edge_name>} ([prop_name_list])
  • index_name: The name of the index. It must be unique in a graph space. A recommended way of naming is i_tagName_propName.
  • IF NOT EXISTS: Creating an existent index results in an error. You can use the IF NOT EXISTS option to conditionally create the index and avoid the error.
  • prop_name_list:

    • To index a variable string property, you must use the prop_name(length) syntax to specify an index length.

      Note

      Long indexes decrease the scan performance of the Storage Service and use more memory. We suggest that you set the indexing length the same as that of the longest string to be indexed. The longest indexing length is 255. Strings longer than 255 are truncated.

    • To index a fixed-length string property, you must use the prop_name syntax, and the index length is the string length you set.
    • To index a tag or an edge type, ignore the prop_name_list in the parentheses.

      Note

      When there is an index for any property of a tag or an edge type, creating another index for the tag or edge type is neither supported nor necessary.

Implementation of the operation

Nebula Graph implements the creation of the index asynchronously in the next heartbeat cycle. To make sure the creation is successful, take one of the following approaches:

  • Find the new index in the result of SHOW TAG/EDGE INDEXES.
  • Wait for two heartbeat cycles, i.e., 20 seconds.

To change the heartbeat interval, modify the heartbeat_interval_secs parameter in the [configuration files] for all services.

Create tag/edge type indexes

The following statement creates an index on the player tag.

nebula> CREATE TAG INDEX player_index on player();

The following statement creates indexes on the edge type like.

nebula> CREATE EDGE INDEX like_index on like();

After indexing a tag or an edge type, you can use the LOOKUP statement to retrieve the VID of all vertices with the tag, or the source vertex ID, destination vertex ID, and ranks of all edges with the edge type. For more information, see List vertices or edges with a tag or an edge type.

Create single-property indexes

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

The preceding statement creates an index for the name property on all vertices carrying the player tag. This statement creates an index using the first 10 characters of the name property.

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);

The preceding statement creates an index for the degree property on all edges carrying the follow edge type.

Create composite property indexes

An index on multiple properties is called a composite index.

Note

Creating index across multiple tags is not supported.

Consider the following example:

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

This statement creates a composite index for the name and age property on all vertices carrying the player tag.

Nebula Graph follows the left matching principle to select indexes. That is, columns in the WHERE conditions must be in the first N columns of the index. For example:

nebula> CREATE TAG INDEX example_index ON TAG t(p1, p2, p3);  -- Create an index for the first 3 properties of tag t
nebula> LOOKUP ON t WHERE p2 == 1 and p3 == 1; -- Not supported
nebula> LOOKUP ON t WHERE p1 == 1;  -- Supported
nebula> LOOKUP ON t WHERE p1 == 1 and p2 == 1;  -- Supported
nebula> LOOKUP ON t WHERE p1 == 1 and p2 == 1 and p3 == 1;  -- Supported

Using index

After the index is created and data is inserted, you can use LOOKUP or MATCH to query the data.

You do not need to specify which indexes to use in a query, Nebula Graph figures that out by itself.


Last update: April 22, 2021