如何让GORM在Map上创建索引?

时间:2014-05-18 00:16:50

标签: grails gorm

在我的Grails 2.3.7项目中,我有一个Product域类,如下所示:

class Product {
    String code
    String description
    Map attributes

    static constraints = {
        code(unique: true)
    }

    static mapping = {
        code index: 'Code_Idx'
        attributes fetch: 'join'
        cache true
        id generator: 'hilo'
    }
}

它转换为此数据库:

create table product (id bigint not null, version bigint not null, code varchar(255) not null unique, description varchar(255) not null, primary key (id));
create table product_attributes (attributes bigint, attributes_idx varchar(255), attributes_elt varchar(255) not null);
create index Code_Idx on product (code);

在数据库中有大约4000个产品,脚手架列表显示它们很好。

除非,当我点击“排序”代码 - 因为没有索引 - 所以我的服务器执行此操作:

explain select this_.id as id14_0_, this_.version as version14_0_, this_.code as code14_0_, this_.description as descript4_14_0_, 
attributes2_.attributes as attributes14_2_, attributes2_.attributes_elt as attributes3_2_, attributes2_.attributes_idx as attributes2_2_ 
from product this_ left outer join product_attributes attributes2_ 
on this_.id=attributes2_.attributes 
order by lower(this_.code) desc limit 90, 100

+----+-------------+--------------+------+---------------+------+---------+------+-------+---------------------------------+
| id | select_type | table        | type | possible_keys | key  | key_len | ref  | rows  | Extra                           |
+----+-------------+--------------+------+---------------+------+---------+------+-------+---------------------------------+
|  1 | SIMPLE      | this_        | ALL  | NULL          | NULL | NULL    | NULL |  4086 | Using temporary; Using filesort |
|  1 | SIMPLE      | attributes2_ | ALL  | NULL          | NULL | NULL    | NULL | 43975 |                                 |
+----+-------------+--------------+------+---------------+------+---------+------+-------+---------------------------------+

显然,这需要很长时间。我可以手动添加索引:

ALTER TABLE `product_attributes` ADD INDEX(`attributes`);

然后它可以正常工作。我认为应该首先自动创建 - 没有索引的架构中没有什么意义 - 但是好吧,我可以ping Gorm来做它。我的问题是 - 我可以在域类中添加什么来让Gorm添加这个索引?

1 个答案:

答案 0 :(得分:0)

Grails不会在示例中的“属性”等列上自动创建索引。为了创建和管理这些索引,我强烈建议您使用Database Migration Plugindocumentation编写得很好,并概述了如何使用它。