【问题标题】: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;    
...
}

【问题讨论】:

    标签: mysql hibernate orm jpa indexing


    【解决方案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) 的位置应使用此注释。

    参考

    【讨论】:

      【解决方案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")})
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2011-07-01
          • 1970-01-01
          • 2021-03-04
          • 2023-03-23
          • 1970-01-01
          • 1970-01-01
          • 2010-09-16
          • 2016-01-10
          相关资源
          最近更新 更多