Hibernate查询中的MySQL索引提示

eeq64g8w  于 2022-11-14  发布在  Mysql
关注(0)|答案(3)|浏览(200)

如何在Hibernate查询中指定MySQL索引提示?
在查询规划器没有选择正确索引的情况下,在MySQL查询中使用索引提示变得势在必行(参考:https://www.percona.com/blog/2012/12/14/the-optimization-that-often-isnt-index-merge-intersection/)。
这可以通过下面指定的RAW查询轻松完成:https://dev.mysql.com/doc/refman/5.7/en/index-hints.html

7gcisfzg

7gcisfzg1#

在Hibernate5中,您可以使用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解析,并在正确的位置注入正确的文本。
纯粹的乐趣!

j0pj023g

j0pj023g2#

我无法使用这种方法,因为没有调用“getQueryHintString”方法。
现在遵循下面描述的解决方案:
How to insert an "Optimizer hint" to Hibernate criteria api query
实现了一个运行良好的休眠拦截器。

unguejic

unguejic3#

从Hibernate 5.2.12开始,MySQL现在也支持使用org.hibernate.query.Query.html#addQueryHint方法的查询提示。

相关问题