Skip to main content
Version: Old ArrowSquid docs

Indexes and unique constraints


The lack of indices is the most common cause of slow API queries

It is crucial to add database indexes to the entity fields on which one expects filtering and ordering. To add an index to a column, the corresponding entity field must be decorated with @index. The corresponding entity field will be decorated with TypeORM @Index().

One can additionally decorate the field with @unique to enforce uniqueness. It corresponds to the @Index({ unique: true }) TypeORM decorator.


type Transfer @entity {
id: ID!
to: Account!
amount: BigInt! @index
fee: BigInt! @index @unique

Multi-column indices

Multi-column indices are defined on the entity level, with an optional unique constraint.


type Foo @entity @index(fields: ["foo", "bar"]) @index(fields: ["bar", "baz"]) 
id: ID!
bar: Int!
baz: [Enum!]
foo: String!

type Extrinsic @entity @index(fields: ["hash", "block"], unique: true) {
id: ID!
hash: String! @unique
block: String!