如何在多列上创建索引
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]
持久化提供者必须遵守指定的顺序 列。
如果未指定
ASC
或DESC
,则ASC
(升序)为 假设。
使用示例:
@Table(indexes =
@Index(columnList = "org,type"),
@Index(columnList = "another_column"))
【讨论】:
以上是关于如何在多列上创建索引的主要内容,如果未能解决你的问题,请参考以下文章