ArangoDB v3.4 reached End of Life (EOL) and is no longer supported.
This documentation is outdated. Please see the most recent version here: Latest Docs
Working with Indexes
Learn how to use different indexes efficiently by going through the ArangoDB Performance Course.
Index Identifiers and Handles
An index handle uniquely identifies an index in the database. It is a string and
consists of the collection name and an index identifier separated by a /
. The
index identifier part is a numeric value that is auto-generated by ArangoDB.
A specific index of a collection can be accessed using its index handle or index identifier as follows:
db.collection.index("<index-handle>");
db.collection.index("<index-identifier>");
db._index("<index-handle>");
For example: Assume that the index handle, which is stored in the _id
attribute of the index, is demo/362549736
and the index was created in a collection
named demo
. Then this index can be accessed as:
db.demo.index("demo/362549736");
Because the index handle is unique within the database, you can leave out the collection and use the shortcut:
db._index("demo/362549736");
Collection Methods
Listing all indexes of a collection
returns information about the indexes
getIndexes()
Returns an array of all indexes defined for the collection.
Since ArangoDB 3.4, indexes()
is an alias for getIndexes()
.
Note that _key
implicitly has an index assigned to it.
Creating an index
Indexes should be created using the general method ensureIndex. This method obsoletes the specialized index-specific methods ensureHashIndex, ensureSkiplist, ensureUniqueConstraint etc.
ensures that an index exists
collection.ensureIndex(index-description)
Ensures that an index according to the index-description exists. A new index will be created if none exists with the given description.
The index-description must contain at least a type attribute. Other attributes may be necessary, depending on the index type.
type can be one of the following values:
- hash: hash index
- skiplist: skiplist index
- fulltext: fulltext index
- geo: geo index, with one or two attributes
sparse can be true or false.
For hash, and skiplist the sparsity can be controlled, fulltext and geo are sparse by definition.
unique can be true or false and is supported by hash or skiplist
Calling this method returns an index object. Whether or not the index object existed before the call is indicated in the return attribute isNewlyCreated.
deduplicate can be true or false and is supported by array indexes of type hash or skiplist. It controls whether inserting duplicate index values from the same document into a unique array index will lead to a unique constraint error or not. The default value is true, so only a single instance of each non-unique index value will be inserted into the index per document. Trying to insert a value into the index that already exists in the index will always fail, regardless of the value of this attribute.
Examples
Dropping an index via a collection handle
drops an index
collection.dropIndex(index)
Drops the index. If the index does not exist, then false is returned. If the index existed and was dropped, then true is returned. Note that you cannot drop some special indexes (e.g. the primary index of a collection or the edge index of an edge collection).
collection.dropIndex(index-handle)
Same as above. Instead of an index an index handle can be given.
Load Indexes into Memory
Loads all indexes of this collection into Memory.
collection.loadIndexesIntoMemory()
This function tries to cache all index entries of this collection into the main memory. Therefore it iterates over all indexes of the collection and stores the indexed values, not the entire document data, in memory. All lookups that could be found in the cache are much faster than lookups not stored in the cache so you get a nice performance boost. It is also guaranteed that the cache is consistent with the stored data.
For the time being this function is only useful on RocksDB storage engine, as in MMFiles engine all indexes are in memory anyways.
On RocksDB this function honors all memory limits, if the indexes you want to load are smaller than your memory limit this function guarantees that most index values are cached. If the index is larger than your memory limit this function will fill up values up to this limit and for the time being there is no way to control which indexes of the collection should have priority over others.
arangosh> db.example.loadIndexesIntoMemory();
{
"result" : true
}
Database Methods
Fetching an index by handle
finds an index
db._index(index-handle)
Returns the index with index-handle or null if no such index exists.
Dropping an index via a database handle
drops an index
db._dropIndex(index)
Drops the index. If the index does not exist, then false is returned. If the index existed and was dropped, then true is returned.
db._dropIndex(index-handle)
Drops the index with index-handle.
Revalidating whether an index is used
finds an index
So you’ve created an index, and since its maintenance isn’t for free, you definitely want to know whether your query can utilize it.
You can use explain to verify whether skiplists or hash indexes are
used (if you omit colors: false
you will get nice colors in ArangoShell):