適応型ハッシュインデックス機能を使用すると、InnoDB
は、トランザクション機能や信頼性を犠牲にすることなく、ワークロードとバッファプールに十分なメモリーを適切に組み合わせたシステム上で、インメモリデータベースのように実行できます。 適応ハッシュインデックス機能は、innodb_adaptive_hash_index
オプションによって有効化され、または --skip-innodb-adaptive-hash-index
オプションにより無効化されます。
検出された検索パターンに基づいて、インデックスキーの接頭辞を使用してハッシュインデックスが作成されます。 接頭辞は任意の長さにでき、B ツリーの一部の値のみがハッシュインデックスに表示される場合があります。 ハッシュインデックスは、頻繁にアクセスされるインデックスのページに対してオンデマンドで作成されます。
テーブルがメインメモリー内にほぼ完全に収容されている場合は、任意の要素の直接検索を有効にし、インデックス値をポインタの一種に変換すると、ハッシュインデックスを使用してクエリーを高速にすることができます。 InnoDB
には、インデックスの検索をモニターするメカニズムが備わっています。 ハッシュインデックスの構築がクエリーにとって有益であると InnoDB
が判断した場合は、自動的にそのインデックスが構築されます。
一部のワークロードでは、ハッシュインデックスの検索による高速化の方が、インデックスの検索をモニターしたり、ハッシュインデックスの構造を保持したりする追加の作業よりも重要です。 適応型ハッシュインデックスへのアクセスは、複数の同時結合など、負荷の高いワークロードで競合の原因になる場合があります。 LIKE
演算子および %
ワイルドカードを使用したクエリーもメリットが得られない傾向があります。 適応型ハッシュインデックス機能のメリットが得られないワークロードの場合、これをオフにすると不要なパフォーマンスオーバーヘッドが軽減されます。 適応型ハッシュインデックス機能が特定のシステムおよびワークロードに適しているかどうかを事前に予測することは困難であるため、有効化および無効化してベンチマークを実行することを検討してください。 MySQL 5.6 のアーキテクチャの変更により、適応型ハッシュインデックス機能を以前のリリースよりも無効にする方が適しています。
適応ハッシュインデックス機能はパーティション化されています。 各インデックスは特定のパーティションにバインドされ、各パーティションは個別のラッチによって保護されます。 パーティション化は、innodb_adaptive_hash_index_parts
変数によって制御されます。 innodb_adaptive_hash_index_parts
変数はデフォルトで 8 に設定されています。 最大設定は 512 です。
SHOW ENGINE INNODB STATUS
出力の SEMAPHORES
セクションで、適応型ハッシュインデックスの使用および競合を監視できます。 btr0sea.c
で作成された RW バッチを待機しているスレッドが多数ある場合は、適応ハッシュインデックスパーティションの数を増やすか、適応ハッシュインデックス機能を無効にすることを検討してください。
ハッシュインデックスのパフォーマンス特性の詳細は、セクション8.3.9「B ツリーインデックスとハッシュインデックスの比較」 を参照してください。