機能説明
ホットスポット更新機能は、高並列処理シナリオ向けの最適化能力であり、秒殺(フラッシュセール)やタイムセールなどのビジネスにおいて、大量のリクエストが同時に同じデータベースレコード(「ホットスポット行」と呼ばれます)を更新する際に発生するパフォーマンスのボトルネック問題を解決するために主に使用されます。
ホットスポット更新保護タスクを作成すると、システムは自動的に単一行のホットスポット更新があるかどうかを検出します。もし存在する場合、これらのホットスポット行更新の競合があるトランザクションを論理的に複数のグループ(group)に分割します。同じグループ内のトランザクション間では、ホットスポット行を更新するステートメントに加えて、他のステートメントも並行して実行されます。これにより、大量の行ロックによる同時実行性のパフォーマンス低下を減らし、高並列処理シナリオにおけるデータベースのパフォーマンスを向上させることができます。DBbrainコンソールを通じて、ホットスポット更新保護タスクの作成、表示、停止、および削除をサポートしています。
この機能のコアとなる動作原理は、以下のフローとして簡単に理解できます:
1. 自動検出:システムはデータベースの更新操作をリアルタイムで監視し、高頻度で更新される特定のデータ行を自動的に識別します。
2. リクエストの待ち行列:ホットスポット行が識別されると、システムはその行に対する後続の同時更新リクエストを待ち行列に入れます。
3. トランザクションの待機とウェイクアップ:論理的なグループ化後、グループ内のトランザクションはホットスポット更新ステートメントの実行時のみ直列化を要求し、他のステートメントの実行時は並列で行われます。
サポートバージョン
カーネルバージョン MySQL 5.7 20250330 以上では、主キーおよびユニークキーに基づくホットスポット更新の最適化をサポートしています。
カーネルバージョン MySQL 8.0 20241001 以上では、主キーに基づくホットスポット更新の最適化をサポートしています。
適用シーン
この機能は、秒殺(フラッシュセール)やタイムセールなどのビジネスシナリオに対応し、大量のユーザーが同時に同じデータ(例:在庫)を更新することによって引き起こされるデータベースのパフォーマンスボトルネック問題を解決するために主に使用されます。
トランザクションの元々の実行時間が比較的長い場合や、長短のトランザクションが混在するシナリオでは、この機能を使用することで実行性能を向上させることができます。
機能メリット
ビジネス側の改修は不要です。
より広範なSQL互換性を備えており、1つのトランザクション内で複数のSELECT FOR UPDATE、UPDATE、またはINSERTのSQLをサポートできます。
以前は前のトランザクションがコミットされた後にしかホットスポット行の更新を開始できませんでしたが、現在は前のトランザクションの更新が完了した時点で実行できるようになり、トランザクションがロックを待つ時間が大幅に短縮されます。
パフォーマンスデータ
インスタンススペック設定:MySQL 8.0 専用型 - 32コア256000MB、ストレージスペース200GB。
ホットスポット更新機能を有効にすると、TencentDB for MySQLのTPSは約3万前後で安定し、実際の業務ニーズを満たすことができます。
機能利用上の注意点
適用可能なトランザクションモードは以下の通りです。ただし、aはインデックスキーであってはならず、そうでない場合は効果が失われます。
BEGIN;
xxx
UPDATE table_name SET a=? WHERE id/pk=?;
yyy
COMMIT;
ユニークキーのホットスポット更新を使用するには、SQLにヒント/*+ TXSQL_UK_HOT_UPDATE */を追加します。使用例は以下の通りです。
UPDATE table_name SET a=? WHERE uk=?;
ホットスポット更新機能を使用する際は、パラメータthread_handlingの値をone-thread-per-connectionに設定してください。
機能利用制限
負荷制限
1つのトランザクション内で同じホットスポットレコードに対して複数回のUPDATEを行うことはできません。
トランザクションがホットスポットのUPDATEを完了した後、後続の文に競合があってはいけません。ホットスポットを構成しなくても、ハング現象が発生する可能性があります。
同一トランザクション内で複数のホットスポットを更新することはできません。
ホットスポット更新負荷期間中は、ホットスポット行を削除することはできません。
パラメータ制限
スレッドプールモードは現在サポートされていません。
Binlogを有効にする必要があり、かつパラメータbinlog_order_commits = ONに設定する必要があります。Binlogを無効にした場合、パラメータinnodb_hot_update_detectを有効にすることはできません。パラメータinnodb_hot_update_detectが有効化されており、かつ負荷内に依然としてホットスポットが存在する場合、Binlogを無効にすることはできません。
パラメータinnodb_hot_update_detectを無効にするには、現在の負荷内のホットスポット更新が終了するまで待つ必要があります。
SELECT FOR UPDATE 制限
SELECT FOR UPDATEとUPDATEは、いずれも主キーインデックスに基づく単一行の更新であり、更新条件は一致しています。
SELECT FOR UPDATEは、UPDATEの前に実行する必要があります。
ユニークキー制限
SELECT UK FOR UPDATEの後にUPDATE UKを実行するトランザクションモードはサポートされていません。
同一トランザクション内で、まず主キーを使用し、その後で一意キーを使用してホットスポット行を更新するトランザクションモードはサポートされていません。トランザクション1が主キーを使用し、トランザクション2が一意キーを使用して同一行を更新する、このような混合更新方式はサポートされています。
機能の使い方
TencentDB for MySQLでは、ホットスポット更新機能を有効にするために以下の2つの方法を提供しています。
方法1:DBbrainコンソールでの有効化
方法2:パラメータによる有効化
パラメータinnodb_hot_update_detectの値をONに設定することで、ホットスポット更新機能を有効にします。
関連パラメータの説明
|
innodb_hot_update_detect | yes | string | OFF | ON/OFF | ホットアップデート機能を有効にしますか。 ON:有効化を意味します。 OFF:無効化を意味します。 |