2017-09-06 115 views
0

如何在Hibernate查询中指定Mysql索引提示?Hibernate查询中的Mysql索引提示

如果查询规划器没有选择正确的索引(参考:https://www.percona.com/blog/2012/12/14/the-optimization-that-often-isnt-index-merge-intersection/),则在Mysql查询中使用索引提示变得非常重要。

这可以通过原始查询轻松完成如下规定:https://dev.mysql.com/doc/refman/5.7/en/index-hints.html

+0

99.9%的查询不需要提示。我们可以看到麻烦的SQL和'SHOW CREATE TABLE'。索引合并交集可以通过添加_composite_index来改进。 (呃,总是我见过。) –

回答

0

在Hibernate 5,您可以定义查询提示使用org.hibernate.query.Query.html#addQueryHint基础数据库。正在使用的SQL方言负责注入与查询中定义的每个提示相关的适当文本。

不幸的是,如果您阅读org.hibernate.dialect.MySQLDialect的来源,您会注意到它不会扩展方法org.hibernate.dialect.Dialect#getQueryHintString,并且默认情况下它什么也不做。

你可以尝试寻找实现数据库查询暗示关于索引,或者,如果你愿意让你的手脏一些替代MySQL的话,你可以扩展MySQL的方言之一,自己做:

public class MySqlExtendedDialect extends MySQLDialect { 

    public String getQueryHintString(String query, List<String> hints) { 
     /** define a format and read the hints, then patch the query appropriately **/ 
     String modifiedQuery = query; 
     return modifiedQuery; 
    } 

} 

例如,您可以在查询中定义一个类似“USE_INDEX_COL1_COL2”的提示。然后当你的方言找到“USE_INDEX_ *”提示时,它需要做一些基本的SQL解析并在正确的位置注入正确的文本。

纯粹的乐趣!