2017-09-06 7 views
0

HibernateクエリでMysqlインデックスヒントを指定するにはどうすればよいですか?HibernateクエリのMysqlインデックスヒント

クエリプランナが正しいインデックス(ref:https://www.percona.com/blog/2012/12/14/the-optimization-that-often-isnt-index-merge-intersection/)を選択しない場合は、Mysqlクエリでインデックスヒントを使用する必要があります。ここで指定されているよう

これは簡単に生のクエリを介して行うことができます:Hibernateは5でhttps://dev.mysql.com/doc/refman/5.7/en/index-hints.html

+0

ヒントの99.9%にヒントは必要ありません。面倒なSQLと 'SHOW CREATE TABLE'を見てみましょう。 _composite_indexを追加することで、インデックスマージの交点を常に改善することができます。 (まあ、私はいつも見てきました。) –

答えて

0

をあなたは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構文解析を行い、適切な場所に適切なテキストを挿入する必要があります。

純粋な楽しみ!