PolarDB for MySQLは、Bツリーインデックスの同時実行制御を最適化して、高同時読み取りおよび書き込み操作のパフォーマンスを向上させます。 このトピックでは、制限、前提条件、およびBツリーインデックス同時実行制御最適化の使用方法について説明します。
背景情報
InnoDBストレージエンジンは、インデックスを使用してテーブルを整理します。 テーブルのデータは、クラスタ化インデックスに格納されます。 テーブル内の他のインデックスは、セカンダリインデックスと呼ばれます。 InnoDBはB-treeインデックス構造を使用します。 フラットでバランスの取れたツリー構造により、データアクセスごとのI/O操作の数が少なく固定されます。
InnoDBは、ロックを使用して、物理ページ (Bツリーノード) のメモリ構造への同時アクセスを制御します。 各物理ページは、読み取り /書き込みロックを提供する。 Bツリーインデックスは、複数のノードおよびエッジからなる。 一般に、単一のノードをロックしても、複数のスレッドがデータにアクセスするときの読み取り /書き込みの一貫性は保証されません。 例えば、スレッドは、Bツリー構造変更動作 (SMO) 中に複数の物理ページを変更する。 他のスレッドが同時にBツリー構造にアクセスすると、Bツリー構造が変更されているため、読み取りまたは書き込み操作中にエラーが発生します。
このようなエラーを回避するために、InnoDBは、スレッドが複数のノードのロックを同時に保持して、Bツリーへの同時アクセスの読み取り /書き込みの一貫性を確保できるようにします。 複数のスレッドがBツリー構造にアクセスするときのデッドロックを防ぐために、ロックルールが提供されます。 InnoDBは、Bツリーの同時読み取りおよび書き込み機能を改善するために、Bツリー同時実行制御のアルゴリズムを複数回最適化します。 次の問題がまだ存在します。
同時SMOはサポートされていません: 一度に許可されるSMOは1つだけです。 その結果、インデックスロックは、非常に同時の読み取りおよび書き込み操作の全体的なパフォーマンスのボトルネックになります。
スレッドは多数のロックを保持します。デッドロックを回避するには、楽観的な操作で、トラバーサルパス上のすべてのノードで共有 (S) ロックを保持する必要があります。 悲観的操作は、ノードを変更する可能性のあるすべての排他的 (X) ロックを保持する必要があります。 スレッドが多数のロックを保持している場合、より高い同時実行性は、より集中的なロック競合を引き起こす。 ロック競合は、キーノードに対してより集中的である。
PolarDB for MySQLは、Bツリーインデックスの同時実行制御を最適化し、次の利点を提供します。
より高い同時実行性: すべての操作がBツリーインデックスに同時にアクセスできるようにし、ページレベルでスレッドの競合を維持します。
より小さなロック粒度: すべての操作にラッチ結合を使用して、ロックとスレッドの競合の数を減らします。
制限事項
この最適化は、Bツリーのプライマリインデックスとセカンダリインデックスにのみ適用できます。 フルテキストインデックスと空間インデックスはサポートされていません。
Bツリー同時実行制御の最適化を使用するには、
innodb_adaptive_hash_index
パラメーターの値をOFFに設定します。
サポートされているバージョン
PolarDB for MySQLクラスターはEnterprise EditionまたはStandard Editionで、次のデータベースエンジンバージョンを実行します。
リビジョンバージョンが8.0.1.1.28以降のMySQL 8.0.1。
リビジョンバージョンが8.0.2.2.17以降のMySQL 8.0.2。
クラスターバージョンの確認方法については、「エンジンバージョンの照会」をご参照ください。
使用法
にログインします。PolarDBコンソール. Bツリー同時実行制御の最適化を有効にするには、loose_innodb_polar_blink_tree
パラメーターの値をONに設定します。 パラメーター値の設定方法の詳細については、「クラスターパラメーターとノードパラメーターの指定」をご参照ください。 次の表に、loose_innodb_polar_blink_tree
パラメーターを示します。
パラメーター | レベル | 説明 |
loose_innodb_polar_blink_tree | グローバル | Bツリー同時実行制御の最適化を有効または無効にします。 有効な値:
|
この最適化はデフォルトで無効になっています。 loose_innodb_polar_blink_tree
パラメーターの値を変更すると、クラスターは自動的に再起動されます。 再起動中、サービスは最大1分間中断されることがあります。 リカバリ時間の長さは、データ量とテーブルの数によって異なります。 この操作をオフピーク時に実行し、アプリケーションがデータベースサービスに自動的に再接続するように構成されていることを確認することをお勧めします。
パフォーマンステスト
同時実行性の高いシナリオ (1,000ウェアハウス) でBツリー同時実行制御の最適化が有効または無効になっている場合のInnoDBのパフォーマンスは、TPC-Cのベンチマークに基づいてテストされます。
Bツリー同時実行制御の最適化が無効になっている場合、InnoDBは同時スレッド数が128ときに最高のパフォーマンスに達します。
Bツリー同時実行制御の最適化が有効になっている場合、InnoDBは同時スレッド数が256ときに最高のパフォーマンスに到達します。 読み書きパフォーマンスは、Bツリー同時実行制御最適化が無効になっている場合よりも140% に高くなります。