Partial index


In databases, a partial index, also known as filtered index is an index which has some condition applied to it so that it includes a subset of rows in the table.
This allows the index to remain small, even though the table may be rather large, and have extreme selectivity.
Suppose you have a transaction table where entries start out with STATUS = 'A', and then may pass through other statuses before reaching a final status, 'F', at which point it is no longer likely to be processed again.
In PostgreSQL, a useful partial index might be defined as:

create index partial_status on txn_table
where status in ;

This index would not bother storing any of the millions of rows that have reached "final" status, 'F', and would allow queries looking for transactions that still "need work" to efficiently search via this index.
Similarly, a partial index can be used to index only those rows where a column is not null, which will be of benefit when the column usually is null.

create index partial_object_update on object_table
where updated_on is not null;

This index would allow the following query to read only the updated tuples:

select * from object_table
where updated_on is not null
order by updated_on;

It is not necessary that the condition be the same as the index criterion; Stonebraker's paper below presents a number of examples with indexes similar to the following:

create index partial_salary on employee
where salary > 2100;

Support

In SQL Server, this type of index is called a filtered index.
Partial indexes have been supported in PostgreSQL since version 7.2, released in February 2002.
SQLite supports partial indexes since version 3.8.0.
MongoDB supports partial indexes in its latest release V3.2.
MySQL as of version 8.0 does not support partial indexes. In MySQL, the term "partial index" is sometimes used to refer to prefix indexes, where only a truncated prefix of each value is stored in the index. This is another technique for reducing index size.