An index is a data structure such as B-Tree that improves the speed of data retrieval on a table at the cost of additional writes and storage to maintain it.
When using plain SQL, to add an index for a column or a set of columns, you use the CREATE INDEX
statement as follows:
CREATE INDEX index_name ON table_name (column_list)
When using JPA 2.1, you can use the javax.persistence.Index annotation to achieve the same result when your DB schema is generated by your Persistence Provider. Here is a sample Entity:
import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.Index; import javax.persistence.Table; @Entity @Table(name = "country", indexes = {@Index(name = "my_index_name", columnList="iso_code", unique = true), @Index(name = "my_index_name2", columnList="name", unique = false)}) public class Country{ @Column(name = "iso_code", nullable = false) private String isoCode; @Column(name = "name", nullable = false) private String name; }
Besides standard indexes, you can also use Multicolumn indexes (also known as composite indexes). These are similar to standard indexes. They both store a sorted “table” of pointers to the main table. Multicolumn indexes however can store additional sorted pointers to other columns.
Here is the sample Entity using a Multicolumn index:
import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.Index; import javax.persistence.Table; @Entity @Table(name = "country", indexes = {@Index(name = "my_index_name", columnList="iso_code,name", unique = true)}) public class Country{ @Column(name = "iso_code", nullable = false) private String isoCode; @Column(name = "name", nullable = false) private String name; }
Finally bear in mind that Hibernate ORM provides a deprecated org.hibernate.annotations.Index annotation. We recommend to rely on JPA 2.1 approach if you want to have Jakarta EE compliant code.