如何在多列上创建索引

Posted

技术标签:

【中文标题】如何在多列上创建索引【英文标题】:How to create indexes on multiple columns 【发布时间】:2011-04-13 03:18:07 【问题描述】:

我们有以下实体关系,其中用户属于特定组织。我的查询看起来像“select * from User where org=:org”或“select * from User where org=:org and type=:type”

我在 User 类上有单独的索引。由于外键元素上的索引,第一个查询会很好。第二个查询是否要求 org 和 type 列上的多列索引。如果是这样,我应该如何注释来创建一个这样的索引。

@Entity 
class User 
...

@ManyToOne 
@ForeignKey
@Index
Organization org;

@Index
Type type;    
...

【问题讨论】:

【参考方案1】:

这可以使用 Hibernate 特定的 @Table 注释来实现。来自文档:

2.4.1 Entity

...

@Table(appliesTo="tableName", indexes = @Index( name="index1", columnNames="column1", "column2" ) ) 在表tableName 的列上创建定义的索引。这可以应用于主表或任何辅助表。 @Tables 注释允许您在不同的表上应用索引。在出现@javax.persistence.Table@javax.persistence.SecondaryTable(s) 的位置应使用此注释。

参考

Hibernate 注释参考指南 2.4. Hibernate Annotation Extensions

【讨论】:

【参考方案2】:

是的,可以使用 JPA 2.1,如此处的规范所示:

http://download.oracle.com/otndocs/jcp/persistence-2_1-pfd-spec/index.html

在第 445 页上指出

索引注解用于模式生成

columnList(必需)要包含在索引中的列的名称。

这里可以看到一个使用示例:

http://java-persistence-performance.blogspot.co.uk/2013/03/but-what-if-im-not-querying-by-id.html

好像语法和Hibernate一样或者很相似。

【讨论】:

【参考方案3】:

正如您在JSR-000338 Java Persistence 2.1 Proposed Final Draft Specification 中看到的那样:

11.1.23 索引注释

Index 注释用于模式生成。请注意,不必为主键指定索引,因为主键索引将自动创建,但是,可以使用 Index 注释来指定主键索引中列的顺序。

@Target() @Retention(RUNTIME)
public @interface Index 
  String name() default "";
  String columnList();
  boolean unique() default false;

columnList元素的语法是column_list,如下:

column::= index_column [,index_column]*
index_column::= column_name [ASC | DESC]

持久化提供者必须遵守指定的顺序 列。

如果未指定ASCDESC,则ASC(升序)为 假设。

使用示例:

@Table(indexes = 
        @Index(columnList = "org,type"),
        @Index(columnList = "another_column"))

【讨论】:

以上是关于如何在多列上创建索引的主要内容,如果未能解决你的问题,请参考以下文章

我们可以在 MS 访问数据库上创建多列唯一索引吗?

具有不同排序方向的多列上的Sql server聚集索引

Django:创建索引:非唯一,多列

索引(简介,创建,删除)

创建表的时候创建索引

HSQLDB 索引和多列约束