2017-06-05 37 views
0

我有一个JPA选择您可以接受参数,然后我们可以使用一些属性(用户名,电子邮件,标识符)进行搜索用户只有一个文本字段来编写标准文本。JPA性能与选择不区分大小写

的问题是性能比较,在数据库中我们对用户registereds的9Millions,并且搜索速度太慢,使用JPA,

形式: - 值(输入文本)

(如果他使用的用户名,电子邮件或标识符他不说了)

用户(表)字段的形式

用户发送值: - 我dentifier - 名称 - 电子邮件

JPA查询

select u from UserEntity u where u.alias LIKE lower(:query) OR u.email LIKE lower(:query) OR lower(u.identifier) LIKE lower(:query) ORDER BY u.alias 

我不知道什么是最好的方法,以提高搜索的速度,(我们有一些指标在表在这些字段中),如果我们删除u.identifier字段中的较低值,则速度会提高很多(几乎是即时)。但是,我们可以通过很多方式获得标识符(迁移,注册,手动客户端插入..)

+0

“使用JPA”,JPA提供者将简单地将其转换为SQL并运行它。那么为什么不看看生成的SQL并专注于这个呢? –

回答

0

您可以使用不同的技术来解决此问题。

一个使用忽略大小写的整理。例如在MySQL中https://dev.mysql.com/doc/refman/5.7/en/case-sensitivity.html

另一种策略是使用带索引的派生字段。例如,在DB2中,您可以创建一个字段'lower_identifier始终以较低值(标识符)'和一个字段中的索引,并且在进行较低搜索时将自动使用它。您不必在JPA中映射该字段。

1

我们有大约900万注册用户,并且搜索速度太慢,使用JPA

请注意,搜索将是太慢不管是否涉及执行查询,只是因为SQL技术查询本身太慢。这就是说问题不是JPA,而是如何改进SQL查询。

LOWER()函数与LIKE运算符的组合增加了很多开销,因为在分析LIKE匹配之前,RDBMS必须将文本函数应用于3个字段。恕我直言,一种很好的方法是使用VIEW来利用3个字段上的LOWER()部分,然后在这个视图上执行查询(用JPA映射一个视图就像映射表一样简单):

CRAETE VIEW user_view AS SELECT id, lower(identifier) AS identifier, lower(alias) AS alias, lower(email) AS email FROM user; 

那么对于搜索创建一个实体:

@Entity 
@Table("user_view") 
public class UserView { 

    @Basic private Long id; 
    @Basic private String identifier; 
    @Basic private String alias; 
    @Basic private String email; 

    // getters and setters as required 
} 

最后的JPQL查询:

String jqpl = "SELECT u FROM UserView u WHERE u.alias LIKE :query OR u.email LIKE :query OR u.identifier LIKE :query"; 

请注意,您可以将小写的query参数作为查询参数直接传递,并且可以在查询执行后对结果列表进行排序。两者都将导致RDBMS减少工作量,从而缩短整体响应时间。

+0

视图封装了查询,但我看不出它会如何提高性能。 –