【问题标题】:Mysql index hints in Hibernate queryHibernate查询中的Mysql索引提示
【发布时间】:2017-09-06 12:00:12
【问题描述】:

如何在 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

【问题讨论】:

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

标签: mysql hibernate indexing query-planner


【解决方案1】:

在 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 解析并在正确的位置注入正确的文本。

纯粹的乐趣!

【讨论】:

    【解决方案2】:

    我无法让这种方法起作用,“getQueryHintString”方法没有被调用。

    现在遵循此处描述的解决方案:

    How to insert an "Optimizer hint" to Hibernate criteria api query

    实现了一个运行良好的休眠拦截器。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-12-13
      • 2014-11-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-02-01
      • 1970-01-01
      • 2014-11-12
      相关资源
      最近更新 更多