我们如何在 Hibernate 查询中指定 Mysql 索引提示?
在查询计划器没有选择正确索引的情况下,在 Mysql 查询中使用索引提示变得势在必行(参考:https ://www.percona.com/blog/2012/12/14/the-optimization-that-often-isnt-索引合并交集/)。
这可以通过此处指定的原始查询轻松完成:https ://dev.mysql.com/doc/refman/5.7/en/index-hints.html
我们如何在 Hibernate 查询中指定 Mysql 索引提示?
在查询计划器没有选择正确索引的情况下,在 Mysql 查询中使用索引提示变得势在必行(参考:https ://www.percona.com/blog/2012/12/14/the-optimization-that-often-isnt-索引合并交集/)。
这可以通过此处指定的原始查询轻松完成:https ://dev.mysql.com/doc/refman/5.7/en/index-hints.html
在 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 解析并在正确的位置注入正确的文本。
纯粹的乐趣!