Hibernate查询中的Mysql索引提示

时间:2017-09-06 12:00:13

标签: mysql hibernate indexing query-planner

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

在查询规划器没有选择正确的索引的情况下,使用Mysql查询中的索引提示变得势在必行(参考:https://www.percona.com/blog/2012/12/14/the-optimization-that-often-isnt-index-merge-intersection/)。

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

1 个答案:

答案 0 :(得分: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;
    }

}

例如,您可以定义一个提示,例如&#34; USE_INDEX_COL1_COL2&#34;在查询中。然后,当你的方言找到&#34; USE_INDEX _ *&#34;提示,它需要做一些基本的SQL解析并在正确的位置注入正确的文本。

纯粹的乐趣!