2017-09-06 78 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解析並在正確的位置注入正確的文本。

純粹的樂趣!