在我的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添加这个索引?
答案 0 :(得分:0)
Grails不会在示例中的“属性”等列上自动创建索引。为了创建和管理这些索引,我强烈建议您使用Database Migration Plugin。 documentation编写得很好,并概述了如何使用它。