---
title: Index types and how indexes are used in ArangoDB
description: The goal of adding indexes to the data model is to speed up a certain query or even multiple queries. One of the first things that should be done during development of AQL queries should be to review the output of the explain com
---

ArangoDB 3.12 Product Release Announcement! Read the blog for details. [Read Blog](https://arangodb.com/2024/03/arangodb-3-12-performance-for-all-your-data-models/)

[![logo](https://blog.arangodb.com/hs-fs/hubfs/Imported_Blog_Media/logo.png?width=301&height=50&name=logo.png "logo")](https://arango.ai)

### Why Graph

[The Rise of Graph](https://arangodb.com/the-rise-of-graph/)

[The Graph ML Gamechanger](https://arangodb.com/the-graph-ml-gamechanger/)

[Consolidate to Graph](https://arangodb.com/graph-vs-relational/)

[Graph DB Basics](https://arangodb.com/graph-database/)

### Products

[Managed Graph DB](https://arangodb.com/arangograph-managedgraphdb/)

[Self-Managed Graph DB](https://arangodb.com/arangograph-selfmanaged/)

[Managed Graph ML](https://arangodb.com/managed-ml-graph/)

[Community Edition](https://arangodb.com/community-server/)

[Compare Products](https://arangodb.com/subscriptions/)

### Solutions

Use Cases

Industries

Solution Accelerators

- [Cyber/Threat Mgmt](https://arangodb.com/solutions/use-cases/cyber-threat-management/)
- [Fraud Detection](https://arangodb.com/solutions/use-cases/fraud-detections/)
- [Supply Chain](https://arangodb.com/solutions/use-cases/supply-chain/)
- [Network Asset Management](https://arangodb.com/solutions/use-cases/network-asset-management/)
- [Customer & Patient 360](https://blog.arangodb.com/solutions/use-case/customer-and-patient-360/)
- [Recommendations](https://arangodb.com/solutions/use-cases/recommendations/)
- [Case Management](https://blog.arangodb.com/solutions/use-case/case-management/)
- [Geospatial Analysis](https://arangodb.com/solutions/use-cases/geospatial/)
- [Master Data Mgmt](https://arangodb.com/solutions/use-cases/master-data-management/)

- [Software & Technology](https://arangodb.com/arangodb-for-software-tech/)
- [Financial Services](https://arangodb.com/arangodb-for-financial-services/)
- [Tele Communication](https://arangodb.com/telecommunications-and-network/)
- [E-commerce](https://arangodb.com/arangodb-for-e-commerce/)
- [Healthcare](https://arangodb.com/arangodb-for-healthcare/)
- [Government](https://arangodb.com/arangodb-for-government/)
- [Aerospace & Defence](https://arangodb.com/arangodb-for-aerospace-defense/)
- [Manufacturing](https://arangodb.com/arangodb-for-manufacturing/)

- [Enterprise Knowledge Graphs](https://arangodb.com/resources/white-papers/enterprise-knowledge-graphs/)
- [Entity Resolution](https://arangodb.com/entity-resolution/)
- [Traceability/Lineage](https://arangodb.com/traceability-and-lineage/)
- [Contexual Relevance](https://arangodb.com/contextual-relevance/)

### Developers

Capabilities

Integrations

Differentiators

- [Graph Traversals](https://arangodb.com/graph-traversals/)
- [Multi-Model DB](https://arangodb.com/multi-model-db/)
- [LLM + Knowledge Graph](https://arangodb.com/llm-knowledge-graph/)
- [Graph ML](https://arangodb.com/managed-ml-graph/)
- [Advanced Geospatial](https://arangodb.com/advanced-geospatial/)
- [Document Store](https://arangodb.com/document-store/)
- [Search Engine](https://arangodb.com/full-text-search-engine/)
- [Security & Compliance](https://arangodb.com/security/)
- [Data Masking](https://arangodb.com/Data-masking/)
- [Key/Value DB](https://arangodb.com/integrated-key-value-support/)

- [Clients / Languages](https://arangodb.com/clients-languages/)
- [BI Tools](https://arangodb.com/bi-tools-support/)
- [Containers](https://arangodb.com/container-support/)
- [Community driven](https://arangodb.com/community-driven/)

- [Model Flexibility](https://arangodb.com/model-flexibility/)
- [Graph Scalability](https://arangodb.com/graph-scalability/)
- [Performance at Scale](https://arangodb.com/performance-at-scale/)
- [Highest Availability](https://arangodb.com/highest-availability/)
- [Unified Query Language](https://arangodb.com/unified-query-languageaql/)
- [Graph + Native Document](https://arangodb.com/graph-document/)
- [Graph + Native Search](https://arangodb.com/graph-search/)
- [Cost Effective](https://arangodb.com/cost-effective-development-operation/)
- [Full Geospatial](https://arangodb.com/full-geospatial/)

### Customers

[All Case Studies](https://arangodb.com/solutions/solutions-customers/#all)

[Government & Cyber](https://arangodb.com/solutions/solutions-customers/#Government-Cyber)

[Manufacturing & Supply Chain](https://arangodb.com/solutions/solutions-customers/#Manufacturing-Supply-Chain)

[Healthcare & Science](https://arangodb.com/solutions/solutions-customers/#Healthcare-Science)

[Retail & Commerce](https://arangodb.com/solutions/solutions-customers/#Retail-Commerce)

[Technology](https://arangodb.com/solutions/solutions-customers/#Technology)

[Education](https://arangodb.com/solutions/solutions-customers/#Education)

[Telco](https://arangodb.com/solutions/solutions-customers/#Telco)

[Financial Services](https://arangodb.com/solutions/solutions-customers/#Financial-Services)

### Learn

[Documentation](https://docs.arangodb.com/stable/)

[Developer Hub](https://developer.arangodb.com/)

[ArangoDB University](https://university.arangodb.com/)

[Blog](https://arangodb.com/blog/)

[Certification](https://arangodb.com/learn/certification/)

[Community](https://arangodb.com/community/)

[Events](https://arangodb.com/events/)

[Resources](https://arangodb.com/resources/)

[Training Center](https://arangodb.com/learn/)

### Company

[About Us](https://arangodb.com/about-us/)

[Team](https://arangodb.com/about-arangodb/)

[Partners](https://arangodb.com/partners/)

[News](https://arangodb.com/news/)

[Careers](https://arangodb.applytojob.com/apply)

### Pricing

- Why Graph 
    - [The Rise of Graph](https://arangodb.com/the-rise-of-graph/)
    - [The Graph ML Gamechanger](https://arangodb.com/the-graph-ml-gamechanger/)
    - [Consolidate to Graph](https://arangodb.com/graph-vs-relational/)
    - [Graph DB Basics](https://arangodb.com/graph-database/)
- Products 
    - [Managed Graph DB](https://arangodb.com/arangograph-managedgraphdb/)
    - [Self-Managed Graph DB](https://arangodb.com/arangograph-selfmanaged/)
    - [Managed Graph ML](https://arangodb.com/managed-ml-graph/)
    - [Community Edition](https://arangodb.com/community-server/)
    - [Compare Products](https://arangodb.com/subscriptions/)
- Solutions 
    - Use Cases 
          - [Cyber/Threat Mgmt](https://arangodb.com/solutions/use-cases/cyber-threat-management/)
          - [Fraud Detection](https://arangodb.com/solutions/use-cases/fraud-detections/)
          - [Supply Chain](https://arangodb.com/solutions/use-cases/supply-chain/)
          - [Network Asset Management](https://arangodb.com/solutions/use-cases/network-asset-management/)
          - [Customer & Patient 360](https://arangodb.com/solutions/use-cases/customer-and-patient-360/)
          - [Recommendations](https://arangodb.com/solutions/use-cases/recommendations/)
          - [Case Management](https://arangodb.com/solutions/use-cases/case-management/)
          - [Geospatial Analysis](https://arangodb.com/solutions/use-cases/geospatial/)
          - [Master Data Mgmt](https://arangodb.com/solutions/use-cases/master-data-management/)
    - Industries 
          - [Software & Technology](https://arangodb.com/arangodb-for-software-tech/)
          - [Financial Services](https://arangodb.com/arangodb-for-financial-services/)
          - [Tele Communication](https://arangodb.com/telecommunications-and-network/)
          - [E-commerce](https://arangodb.com/arangodb-for-e-commerce/)
          - [Healthcare](https://arangodb.com/arangodb-for-healthcare/)
          - [Government](https://arangodb.com/arangodb-for-government/)
          - [Aerospace & Defence](https://arangodb.com/arangodb-for-aerospace-defense/)
          - [Manufacturing](https://arangodb.com/arangodb-for-manufacturing/)
    - Solution Accelerators 
          - [Enterprise Knowledge Graphs](https://arangodb.com/resources/white-papers/enterprise-knowledge-graphs/)
          - [Entity Resolution](https://arangodb.com/entity-resolution/)
          - [Traceability/Lineage](https://arangodb.com/traceability-and-lineage/)
          - [Contexual Relevance](https://arangodb.com/contextual-relevance/)
- Customers 
    - [All Case Studies](https://arangodb.com/solutions/solutions-customers/#all)
    - [Government & Cyber](https://arangodb.com/solutions/solutions-customers/#Government-Cyber)
    - [Manufacturing & Supply Chain](https://arangodb.com/solutions/solutions-customers/#Manufacturing-Supply-Chain)
    - [Healthcare & Science](https://arangodb.com/solutions/solutions-customers/#Healthcare-Science)
    - [Retail & Commerce](https://arangodb.com/solutions/solutions-customers/#Retail-Commerce)
    - [Technology](https://arangodb.com/solutions/solutions-customers/#Technology)
    - [Education](https://arangodb.com/solutions/solutions-customers/#Education)
    - [Telco](https://arangodb.com/solutions/solutions-customers/#Telco)
    - [Financial Services](https://arangodb.com/solutions/solutions-customers/#Financial-Services)
- Learn 
    - [Documentation](https://docs.arangodb.com/stable/)
    - [Developer Hub](https://developer.arangodb.com/)
    - [ArangoDB University](https://university.arangodb.com/)
    - [Blog](https://arangodb.com/blog/)
    - [Certification](https://arangodb.com/learn/certification/)
    - [Community](https://arangodb.com/community/)
    - [Events](https://arangodb.com/events/)
    - [Resources](https://arangodb.com/resources/)
    - [Training Center](https://arangodb.com/learn/)
- Company 
    - [About Us](https://arangodb.com/about-us/)
    - [Team](https://arangodb.com/about-arangodb/)
    - [Partners](https://arangodb.com/partners/)
    - [News](https://arangodb.com/news/)
    - [Careers](https://arangodb.applytojob.com/apply)
- [Pricing](https://arangodb.com/download-major/pricing/)

[**Start Free** ArangoGraph Cloud](https://dashboard.arangodb.cloud/signup?acceptedTermsAndConditions=1)

[**Download Now** ArangoDB Enterprise](https://arangodb.com/download-arangodb-enterprise/)

![Vector-5](https://blog.arangodb.com/hubfs/Imported_Blog_Media/search.svg)

# Index types and how indexes are used in ArangoDB: Part II

 March 01, 2018

 Tags: [Performance](https://blog.arangodb.com/blog/topic/performance), [geo](https://blog.arangodb.com/blog/topic/geo), [General](https://blog.arangodb.com/blog/topic/general), [RocksDB](https://blog.arangodb.com/blog/topic/rocksdb)

[Twitter](https://twitter.com/intent/tweet?url=https://blog.arangodb.com/blog/2018/03/index-types-indexes-used-arangodb-part-2) [LinkedIn](http://www.linkedin.com/shareArticle?mini=true&url=https://blog.arangodb.com/blog/2018/03/index-types-indexes-used-arangodb-part-2) [Reddit](https://www.reddit.com/share?url=https://blog.arangodb.com/blog/2018/03/index-types-indexes-used-arangodb-part-2) [Yahoo](https://plus.google.com/share?url=https://blog.arangodb.com/blog/2018/03/index-types-indexes-used-arangodb-part-2%3Futm_medium%3Dsocial%26utm_source%3Dgoogle_plus)

![](https://blog.arangodb.com/hubfs/ArangoDB-Blog/clock.svg)Estimated reading time: 9 minutes

In the first part of this article we dived deep into what indexes are currently available in ArangoDB (3.2 and 3.3), also briefly looking at what improvements are coming with ArangoDB 3.4. [Read Part I here](https://blog.arangodb.com/blog/2018/02/indexes-types-arangodb-part-1).

In this Part II, we are going to focus on how to actually add indexes to a data model and speed up specific queries.

### Adding indexes to the data model

The goal of adding an extra index to the data model is to speed up a certain query or even multiple queries.

One of the first things that should be done during development of AQL queries should be to review the output of the `explain` command. A query can be explained using ArangoDB’s WEB UI or from the ArangoShell. In the ArangoShell it is as simple as `db._explain(query)`, where `query` is the AQL query string. To explain a query which also has bind parameters, they need to be passed separately into the command, e.g. `db._explain(query, bindParameters)`.

### Use case: adding a hash index to avoid a full collection scan

When there are no indexes present and the query accesses a collection with a lot of documents, it will very likely end up doing a full collection scan, meaning that every document in the collection is inspected (potentially even read from disk). This will take time proportional to the number of documents in the collection.

Consider the following query on a collection \`test\` that was just created (i.e. no indexes present apart from the primary index):

```

arangosh> db._explain(`FOR doc IN test FILTER doc.value == 4711 RETURN doc`)

Execution plan:
 Id   NodeType                     Est.   Comment
  1   SingletonNode                   1   * ROOT
  2   EnumerateCollectionNode   1000000     - FOR doc IN test   /* full collection scan */
  3   CalculationNode           1000000       - LET #1 = (doc.`value` == 4711)   /* simple expression */ 
  4   FilterNode                1000000       - FILTER #1
  5   ReturnNode                1000000       - RETURN doc

Indexes used:
 none
```

This shows that no indexes will be used when executing this query, and that the optimizer has picked a full collection scan to look at all the documents in the collection (note: this is indicated by `EnumerateCollectionNode` in the execution plan above. `EnumerateCollectionNode` is the name of some component that scans all the documents in a collection). As the collection contains 1,000,000 documents, this query is almost guaranteed to be slow without a proper index.

To make this query perform better, an index on `value` is clearly needed. Candidate index types for the new index are `hash` or `skiplist`.

- For MMFiles, the difference between these two types is huge, as a hash index will have amortized complexity of O(1) for all operations, whereas a skiplist index has amortized complexity of O(log n). That means the skiplist index will be much more expensive than a hash index in MMFiles.
- For the RocksDB engine, both index types can be used interchangeably.

As a general rule, we should use a hash index if we are certain all queries will look up `value` by equality (as above). If that is not known in advance, or if there will be queries that look up `value` using range lookups, or that sort by `value`, we may be better off with a skiplist index at least for MMFiles.

The next decision for the new index is if it can be made unique (which may slightly improve lookup performance) or not. In this case we know that `value` is not going to be unique in that collection so we need to pick a non-unique index. We also know that all documents in that collection do contain a non-`null` `value` attribute, so we will not benefit from a sparse index here at all.

By creating a non-unique, non-sparse hash index on `value`, the same query’s execution plan greatly improves to just:

```

Query string:
 FOR doc IN test FILTER doc.value == 4711 RETURN doc

Execution plan:
 Id   NodeType        Est.   Comment
  1   SingletonNode      1   * ROOT
  6   IndexNode        200     - FOR doc IN test   /* hash index scan */
  5   ReturnNode       200       - RETURN doc

Indexes used:
 By   Type   Collection   Unique   Sparse   Selectivity   Fields        Ranges
  6   hash   test         false    false         0.50 %   [ `value` ]   (doc.`value` == 4711)
```

with an estimated 200 documents to look at instead of 1,000,000. That is an improvement by several orders of magnitude.

### Use case: adding a combined index

Assume we have a query like the following, which will try to find documents for a given category and with timestamps that fall into a specific time period:

```

FOR doc IN test 
  FILTER doc.category == 'test2' 
  FILTER doc.timestamp > DATE_NOW() - 100000 AND doc.timestamp < DATE_NOW() 
  RETURN doc
```

Now it is possible to create a hash index on the category \`attribute\` and a skiplist index on `timestamp`.

This will bring up an execution plan that only uses one of the indexes we just created:

```

Execution plan:
 Id   NodeType           Est.   Comment
  1   SingletonNode         1   * ROOT
  8   IndexNode         10000     - FOR doc IN test   /* hash index scan */
  5   CalculationNode   10000       - LET #3 = ((doc.`timestamp` > (DATE_NOW() - 100000)) && (doc.`timestamp` < DATE_NOW()))  
  6   FilterNode        10000       - FILTER #3
  7   ReturnNode        10000       - RETURN doc

Indexes used:
 By   Type   Collection   Unique   Sparse   Selectivity   Fields           Ranges
  8   hash   test         false    false         0.01 %   [ `category` ]   (doc.`category` == "test2")
```

**Why doesn’t the query use both indexes?**

In general, the query optimizer will pick one index per **FOR** loop in an AQL query and use it. Even though there are two indexes available, it is not guaranteed that using the two index would produce a better result in terms of execution speed.  
So the optimizer will pick the one index for which it thinks the less documents will need to be inspected and returned.

Still this can be improved. Instead of creating individual indexes on `category`and `timestamp`, it would be much better here to create a combined skiplist index on `category` and `timestamp` (in this order).

With that index, the execution plan get simplified to

```

Execution plan:
 Id   NodeType        Est.   Comment
  1   SingletonNode      1   * ROOT
  8   IndexNode        666     - FOR doc IN test   /* skiplist index scan */
  7   ReturnNode       666       - RETURN doc

Indexes used:
 By   Type       Collection   Unique   Sparse   Selectivity   Fields                        Ranges
  8   skiplist   test         false    false        99.94 %   [ `category`, `timestamp` ]   ((doc.`category` == "test2") && (doc.`timestamp` > (DATE_NOW() - 100000)) && (doc.`timestamp` < DATE_NOW()))
```

which will likely correspond to far less documents that need to be inspected and thus much better query execution performance. As a bonus, that combined index can also be used for filtering on `category` alone, for sorting on `category`, or for sorting on `category` and `timestamp`.

For example, if our query is

```

FOR doc IN test 
  FILTER doc.category == 'test2' 
  FILTER doc.timestamp > DATE_NOW() - 100000 AND doc.timestamp < DATE_NOW()  
  SORT doc.timestamp DESC 
RETURN doc
```

the execution plan of it will not be any more complex, thanks to the combined index that can handle the sort:

```

Execution plan:
 Id   NodeType        Est.   Comment
  1   SingletonNode      1   * ROOT
 10   IndexNode        666     - FOR doc IN test   /* reverse skiplist index scan */
  9   ReturnNode       666       - RETURN doc

Indexes used:
 By   Type       Collection   Unique   Sparse   Selectivity   Fields                        Ranges
 10   skiplist   test         false    false        99.94 %   [ `category`, `timestamp` ]   ((doc.`category` == "test2") && (doc.`timestamp` > (DATE_NOW() - 100000)) && (doc.`timestamp` < DATE_NOW()))
```

Note: sorting on `timestamp` here is only possible because we are filtering on a constant `category` in a way, so we will only see a single `category` value being returned by this query. The query optimizer is smart enough to detect this and will use the index for sorting even if `category` was not specified in the **SORT** clause.

### One vs. multiple indexes

A query can use more than one index per collection, but for each **FOR** loop in an AQL query the optimizer will use at most one index if the filter conditions are combined with logical **AND**. The optimizer will try to pick the index that promises to reduce work (filtering, sorting) by the greatest amount. If there are multiple candidate indexes, they will all be looked at, but the one with the least expected cost will be chosen. Therefore it often makes sense to use combined indexes.

In case there are filter conditions on different attributes combined with logical **OR**, the optimizer may pick more than one index even for the same **FOR** loop.

### Things to avoid

### Creating too many indexes

Creating extra indexes comes with a cost, consisting of storage costs and runtime overhead.

The MMFiles engine has in-memory indexes, so every index that is created will hog a fraction of the scarce RAM. For the RocksDB engine the indexes will be stored on disk, so they will take up disk space. Additionally, even though the RocksDB engine’s indexes will not be built up in RAM, they may still use some RAM because index values may land in some in-memory caches too.

Regarding runtime overhead, here is the list of situations when indexes have an effect on performance:

- The index is initially created, and all documents from the collections are inserted into the index. This will take time proportional to the number of documents in the collection, and the runtime will also depend on the algorithmic complexity of the index internals.
- On every document insert, update, replace or remove operation the index needs to be changed as well. This will extend the time required for all document operations that affect the index.
- The collection is loaded again after a server restarted, and the in-memory index is built up from the on-disk document data (note: this is relevant for the MMFiles engine only, it will not happen for the RocksDB engine as it has all its indexes on disk and does not build them up in memory on collection load).

Therefore one only wants to create the indexes that are actually required. It makes no sense to index every existing attribute, because that is guaranteed to slow down writes, but at the same time has only a questionable effect on the performance of lookup queries.

Often it makes most sense to index the attributes that are used in the majority of queries, so that also the majority of queries improves. It is even more useful to find combinations of attributes that are used together in several queries, and then create combined indexes on them.

When in doubt, one should measure the effect of extra indexes on queries and data-modification operations, by using `explain`, and by tracking query execution times in the client applications.

However, not using indexes where they could greatly improve the situation should also be avoided for obvious reasons.

### Using Function calls on index attributes

In contrast to some other databases, ArangoDB does not provide any indexes that can store functions results or other evaluated expression values. Using a function on an indexed document attribute in a **FILTER** condition will very likely render the index useless for that query.

For example, assume there is an index present on attribute `value` in collection `test`. The following query will try to compare all values from the index in their lower-cased variant against a constant search string. However, it will not use the index, because the index cannot provide the result of the `LOWER` AQL function. So instead the query will do a full collection scan:

```

FOR doc IN test FILTER LOWER(doc.value) == 'bart' RETURN doc

Execution plan:
 Id   NodeType                    Est.   Comment
  1   SingletonNode                  1   * ROOT
  2   EnumerateCollectionNode   100000     - FOR doc IN test   /* full collection scan */
  3   CalculationNode           100000       - LET #1 = (LOWER(doc.`value`) == "bart") 
  4   FilterNode                100000       - FILTER #1
  5   ReturnNode                100000       - RETURN doc

Indexes used:
 none
```

To make this query use an index on attribute `value`, there are two options, which both require slight changes to the data model.

- if possible, only store `value` values as completely lower-cased. Then it is only required to convert all lookup values to lowercase.
- add an extra attribute `lowercasedValue` to the collection to store the lower-cased version of `value`, solely for the purpose of using an index for it. The index then needs to be created on `lowercasedValue` and not `value`.

An example for the latter follows:

```

FOR doc IN test FILTER doc.lowercasedValue == LOWER('bart') RETURN doc

Execution plan:
 Id   NodeType        Est.   Comment
  1   SingletonNode      1   * ROOT
  6   IndexNode          1     - FOR doc IN test   /* hash index scan */
  5   ReturnNode         1       - RETURN doc

Indexes used:
 By   Type   Collection   Unique   Sparse   Selectivity   Fields                  Ranges
  6   hash   test         false    false        99.99 %   [ `lowercasedValue` ]   (doc.`lowercasedValue` == "bart")
```

### Creating sparse indexes

In some cases declaring an index sparse will prevent the query optimizer from using it.

For example, this two-collection join will turn into a nightmare with sparse indexes.

```

FOR doc1 IN test1 FOR doc2 IN test2 FILTER doc1.value == doc2.value RETURN doc1

Execution plan:
 Id   NodeType                  Est.   Comment
  1   SingletonNode                1   * ROOT
  3   EnumerateCollectionNode      0     - FOR doc2 IN test2   /* full collection scan */
  2   EnumerateCollectionNode      0       - FOR doc1 IN test1   /* full collection scan */
  4   CalculationNode              0         - LET #2 = (doc1.`value` == doc2.`value`)  
  5   FilterNode                   0         - FILTER #2
  6   ReturnNode                   0         - RETURN doc1
```

The reason for not using the indexes here is that in each collection there may be documents that do not have a `value` attribute, or contain a `value` attribute with a value of `null`. If the optimizer would be using any of the sparse indexes on `value`, it would not find these documents (as they would not have been indexed). So without using the indexes the query would produce more results than with using the indexes. This is a situation that the optimizer must avoid, so it will discard the sparse indexes and go on without. Note that it would still use non-sparse indexes here if present, but the point here is to show that declaring an index sparse can have undesired effects for some queries.

So an index should only be declared sparse when all queries using that attribute have been checked and it was found that the index can still be used for them even if sparse.

**What’s next**

We are currently working on [ArangoSearch](https://blog.arangodb.com/blog/2018/01/milestone-arangodb-3-4-arangosearch-information-retrieval) (coming with ArangoDB 3.4) which will be a superior replacement for the existing fulltext index. It offers relevance ranking, allows indexing of multiple attributes and supports multiple languages (including Chinese & Russian). You can already try it out by [downloading a 3.4 Milestone](https://www.arangodb.com/download/) and going through [ArangoSearch tutorial](https://www.arangodb.com/learn/search/tutorial).

We are also working on significantly extending and improving geo index functionality coming with ArangoDB 3.4. It will offer more advanced querying functionality, performance optimizations and support for standard GeoJSON types (polygons, multi-polygons, polylines, intersections, etc.).

Join our [Community Slack](https://arangodb-community.slack.com) to give us feedback, improvement suggestions, if you have any questions or just to chat with us.

[Twitter](https://twitter.com/intent/tweet?url=https://blog.arangodb.com/blog/2018/03/index-types-indexes-used-arangodb-part-2) [LinkedIn](http://www.linkedin.com/shareArticle?mini=true&url=https://blog.arangodb.com/blog/2018/03/index-types-indexes-used-arangodb-part-2) [Reddit](https://www.reddit.com/share?url=https://blog.arangodb.com/blog/2018/03/index-types-indexes-used-arangodb-part-2) [Yahoo](https://plus.google.com/share?url=https://blog.arangodb.com/blog/2018/03/index-types-indexes-used-arangodb-part-2%3Futm_medium%3Dsocial%26utm_source%3Dgoogle_plus)

![Picture of Jan Steemann](https://blog.arangodb.com/hubfs/Imported_Blog_Media/Authors/Jan-Steemann-100x100.webp)

 March 01, 2018 , [Jan Steemann](https://blog.arangodb.com/blog/author/jan-steemann)

After more than 30 years of playing around with 8 bit computers, assembler and scripting languages, Jan decided to move on to work in database engineering. Jan is now a senior C/C++ developer with the ArangoDB core team, being there from version 0.1. He is mostly working on performance optimization, storage engines and the querying functionality. He also wrote most of AQL (ArangoDB’s query language).

### Leave a Comment

 Tags

- [General](https://blog.arangodb.com/blog/topic/general)
- [Release](https://blog.arangodb.com/blog/topic/release)
- [Community](https://blog.arangodb.com/blog/topic/community)
- [Releases](https://blog.arangodb.com/blog/topic/releases)
- [Performance](https://blog.arangodb.com/blog/topic/performance)
- [Tutorial](https://blog.arangodb.com/blog/topic/tutorial)
- [Foxx](https://blog.arangodb.com/blog/topic/foxx)
- [AQL](https://blog.arangodb.com/blog/topic/aql)
- [API](https://blog.arangodb.com/blog/topic/api)
- [Newsletter](https://blog.arangodb.com/blog/topic/newsletter)
- [Cluster](https://blog.arangodb.com/blog/topic/cluster)
- [Graph](https://blog.arangodb.com/blog/topic/graph)
- [Graphs](https://blog.arangodb.com/blog/topic/graphs)
- [Documentation](https://blog.arangodb.com/blog/topic/documentation)
- [Javascript](https://blog.arangodb.com/blog/topic/javascript)
- [Query Language](https://blog.arangodb.com/blog/topic/query-language)
- [Architecture](https://blog.arangodb.com/blog/topic/architecture)
- [NoSQL](https://blog.arangodb.com/blog/topic/nosql)
- [Enterprise](https://blog.arangodb.com/blog/topic/enterprise)
- [Ruby](https://blog.arangodb.com/blog/topic/ruby)
- [RocksDB](https://blog.arangodb.com/blog/topic/rocksdb)
- [testing](https://blog.arangodb.com/blog/topic/testing)
- [ArangoML](https://blog.arangodb.com/blog/topic/arangoml)
- [Machine Learning](https://blog.arangodb.com/blog/topic/machine-learning)
- [Benchmark](https://blog.arangodb.com/blog/topic/benchmark)
- [Java](https://blog.arangodb.com/blog/topic/java)
- [driver](https://blog.arangodb.com/blog/topic/driver)
- [multi-model](https://blog.arangodb.com/blog/topic/multi-model)
- [geo](https://blog.arangodb.com/blog/topic/geo)
- [how to](https://blog.arangodb.com/blog/topic/how-to)
- [Drivers](https://blog.arangodb.com/blog/topic/drivers)
- [PHP](https://blog.arangodb.com/blog/topic/php)
- [Security](https://blog.arangodb.com/blog/topic/security)
- [nodejs](https://blog.arangodb.com/blog/topic/nodejs)
- [python](https://blog.arangodb.com/blog/topic/python)
- [ArangoSearch](https://blog.arangodb.com/blog/topic/arangosearch)
- [Kubernetes](https://blog.arangodb.com/blog/topic/kubernetes)
- [Presentation](https://blog.arangodb.com/blog/topic/presentation)
- [open-source](https://blog.arangodb.com/blog/topic/open-source)
- [Future-of-nosql](https://blog.arangodb.com/blog/topic/future-of-nosql)
- [GitHub](https://blog.arangodb.com/blog/topic/github)
- [ARM: Raspberry + Co.](https://blog.arangodb.com/blog/topic/arm-raspberry-co-)
- [Fraud Detection](https://blog.arangodb.com/blog/topic/fraud-detection)
- [Managed Service](https://blog.arangodb.com/blog/topic/managed-service)
- [arangosh](https://blog.arangodb.com/blog/topic/arangosh)
- [C++](https://blog.arangodb.com/blog/topic/c)
- [Cloud](https://blog.arangodb.com/blog/topic/cloud)
- [Conferences](https://blog.arangodb.com/blog/topic/conferences)
- [Data Science](https://blog.arangodb.com/blog/topic/data-science)
- [HTTP](https://blog.arangodb.com/blog/topic/http)
- [ML](https://blog.arangodb.com/blog/topic/ml)
- [Pregel](https://blog.arangodb.com/blog/topic/pregel)
- [Replication](https://blog.arangodb.com/blog/topic/replication)
- [WebUI](https://blog.arangodb.com/blog/topic/webui)
- [graph database](https://blog.arangodb.com/blog/topic/graph-database)
- [monitoring](https://blog.arangodb.com/blog/topic/monitoring)
- [pytorch](https://blog.arangodb.com/blog/topic/pytorch)
- [Application Server](https://blog.arangodb.com/blog/topic/application-server)
- [ArangoGraphML](https://blog.arangodb.com/blog/topic/arangographml)
- [Community Edition](https://blog.arangodb.com/blog/topic/community-edition)
- [Compliance](https://blog.arangodb.com/blog/topic/compliance)
- [Linux](https://blog.arangodb.com/blog/topic/linux)
- [Publication](https://blog.arangodb.com/blog/topic/publication)
- [Relational Database](https://blog.arangodb.com/blog/topic/relational-database)
- [SOC 2](https://blog.arangodb.com/blog/topic/soc-2)
- [Windows](https://blog.arangodb.com/blog/topic/windows)
- [licensing](https://blog.arangodb.com/blog/topic/licensing)
- [networkx](https://blog.arangodb.com/blog/topic/networkx)
- [storage](https://blog.arangodb.com/blog/topic/storage)
- [ARM](https://blog.arangodb.com/blog/topic/arm)
- [Alliances](https://blog.arangodb.com/blog/topic/alliances)
- [ArangoDB Cloud](https://blog.arangodb.com/blog/topic/arangodb-cloud)
- [ArangoSync](https://blog.arangodb.com/blog/topic/arangosync)
- [Arangograph](https://blog.arangodb.com/blog/topic/arangograph)
- [CNFC](https://blog.arangodb.com/blog/topic/cnfc)
- [DC/OS](https://blog.arangodb.com/blog/topic/dc-os)
- [DGL Adaptor](https://blog.arangodb.com/blog/topic/dgl-adaptor)
- [Data Loader](https://blog.arangodb.com/blog/topic/data-loader)
- [Dev Days 2021](https://blog.arangodb.com/blog/topic/dev-days-2021)
- [Developer Hub](https://blog.arangodb.com/blog/topic/developer-hub)
- [Funding Announcement](https://blog.arangodb.com/blog/topic/funding-announcement)
- [GO](https://blog.arangodb.com/blog/topic/go)
- [GenAI](https://blog.arangodb.com/blog/topic/genai)
- [Graph DB](https://blog.arangodb.com/blog/topic/graph-db)
- [Graph DBs](https://blog.arangodb.com/blog/topic/graph-dbs)
- [Graph Databases](https://blog.arangodb.com/blog/topic/graph-databases)
- [Graph Neural Networks](https://blog.arangodb.com/blog/topic/graph-neural-networks)
- [GraphDB](https://blog.arangodb.com/blog/topic/graphdb)
- [Inside ArangoDB](https://blog.arangodb.com/blog/topic/inside-arangodb)
- [Intel](https://blog.arangodb.com/blog/topic/intel)
- [Intel PyG](https://blog.arangodb.com/blog/topic/intel-pyg)
- [Intel Xeon CPU](https://blog.arangodb.com/blog/topic/intel-xeon-cpu)
- [KG](https://blog.arangodb.com/blog/topic/kg)
- [Knowledge Graphs](https://blog.arangodb.com/blog/topic/knowledge-graphs)
- [LLM](https://blog.arangodb.com/blog/topic/llm)
- [Large Language Models](https://blog.arangodb.com/blog/topic/large-language-models)
- [Migrate to Graph](https://blog.arangodb.com/blog/topic/migrate-to-graph)
- [NetworkX Adaptor](https://blog.arangodb.com/blog/topic/networkx-adaptor)
- [Oasis](https://blog.arangodb.com/blog/topic/oasis)
- [Partners](https://blog.arangodb.com/blog/topic/partners)
- [PyG](https://blog.arangodb.com/blog/topic/pyg)
- [PyTorch Geometric](https://blog.arangodb.com/blog/topic/pytorch-geometric)
- [RDF](https://blog.arangodb.com/blog/topic/rdf)
- [Series B](https://blog.arangodb.com/blog/topic/series-b)
- [adapter](https://blog.arangodb.com/blog/topic/adapter)
- [analytics](https://blog.arangodb.com/blog/topic/analytics)
- [analyzers](https://blog.arangodb.com/blog/topic/analyzers)
- [arangopipe](https://blog.arangodb.com/blog/topic/arangopipe)
- [atomics](https://blog.arangodb.com/blog/topic/atomics)
- [aws](https://blog.arangodb.com/blog/topic/aws)
- [collaboration](https://blog.arangodb.com/blog/topic/collaboration)
- [concurrency](https://blog.arangodb.com/blog/topic/concurrency)
- [dev days](https://blog.arangodb.com/blog/topic/dev-days)
- [fuzzy search](https://blog.arangodb.com/blog/topic/fuzzy-search)
- [graphsage](https://blog.arangodb.com/blog/topic/graphsage)
- [licence](https://blog.arangodb.com/blog/topic/licence)
- [memory model](https://blog.arangodb.com/blog/topic/memory-model)
- [plugin](https://blog.arangodb.com/blog/topic/plugin)
- [preprocessing](https://blog.arangodb.com/blog/topic/preprocessing)
- [recommendation](https://blog.arangodb.com/blog/topic/recommendation)
- [resource description framework](https://blog.arangodb.com/blog/topic/resource-description-framework)
- [semantic web](https://blog.arangodb.com/blog/topic/semantic-web)
- [torch](https://blog.arangodb.com/blog/topic/torch)
- [turtle](https://blog.arangodb.com/blog/topic/turtle)
- [x86](https://blog.arangodb.com/blog/topic/x86)
- [— Relational Database](https://blog.arangodb.com/blog/topic/-relational-database)

[![logo](https://blog.arangodb.com/hs-fs/hubfs/Imported_Blog_Media/logo.png?width=301&height=50&name=logo.png "logo")](https://arango.ai)

ArangoGraph Insights Platform Accelerate application innovation and performance with our next-generation graph data and analytics platform.

- <https://www.facebook.com/arangodb.database/>
- <https://twitter.com/i/flow/login?redirect_after_login=%2Farangodb>
- <https://www.instagram.com/arangodb/>
- <https://www.linkedin.com/company/arangodb/>
- <https://www.youtube.com/user/ArangoDB>

#### Quick Links

- [Quick Start](https://docs.arangodb.com/3.11/)
- [Roadmap](https://arangodb.com/roadmap/)
- [Language Drivers](https://docs.arangodb.com/3.11/develop/drivers/)
- [Case Studies](https://arangodb.com/solutions/solutions-customers/#all)
- [BI Connectors](https://arangodb.com/community-driven/bi-connector-arangodb/)
- [Certification Exam](https://arangodb.com/learn/certification/)

#### Info

- [Community](https://arangodb.com/community/)
- [Events](https://arangodb.com/events)
- [Online Meetup](https://www.meetup.com/online-ArangoDB-meetup/)
- [Logo/Resources](https://arangodb.com/resources/logos/)
- [Stackoverflow](https://stackoverflow.com/questions/tagged/arangodb)
- [Slack](https://join.slack.com/t/arangodb-community/shared_invite/zt-2d4p43cma-flyf72j9a9wq4A2OtuMFkA)

#### About Us

- [About Us](https://arangodb.com/about-us/)
- [Jobs](https://arangodb.applytojob.com/apply)
- [Imprint](https://arangodb.com/imprint/)
- [Contact Us](https://arangodb.com/contact/)
- [News](https://arangodb.com/news/)
- [Google Groups](https://groups.google.com/g/arangodb)

#### Stay In Touch

Keep up with the latest news from the ArangoDB

 ©2023 ArangoDB. All Rights Reserved.

[Terms & Conditions](https://cloud.arangodb.com/terms-and-conditions)|[Our Privacy Policy](https://cloud.arangodb.com/privacy-policy)

![](https://www.facebook.com/tr?id=336858843477853&ev=PageView&noscript=1)