MySQL が大規模トランザクションを避けるべき理由とその解決方法

MySQL が大規模トランザクションを避けるべき理由とその解決方法

何が大問題ですか?

長時間実行され、長時間コミットされないトランザクションは、大規模トランザクションと呼ばれます。

大企業の原因

  • 操作するデータがさらにあります
  • ロック競合が多い
  • トランザクションにはDB以外の時間のかかる操作が他にもある
  • 。 。 。

大きな出来事の影響

  • 同時実行状況では、データベース接続プールがバーストする傾向がある
  • ロックするデータが多すぎるため、ブロックやロックタイムアウトが頻繁に発生する
  • 実行時間が長く、マスタースレーブ遅延が発生する可能性がある
  • ロールバックには長い時間がかかります
  • UNDOログの拡張
  • 。 。 。

大規模なトランザクションをクエリする方法

**注**: この記事のSQL操作はMySQLバージョン5.7に基づいています。

クエリ実行時間が 10 秒を超える場合を例に挙げます。

information\_schema.innodb\_trx から TIME\_TO\_SEC(timediff(now(),trx\_started))>10 となる \* を選択します。

大きな取引を避ける方法

一般的な解決策

  • トランザクションで一度に大量のデータを処理しないようにする
  • トランザクションでは、不要なクエリを避けるようにしてください
  • トランザクションでは、トランザクション タイムアウトを引き起こす可能性のある、時間のかかる操作をあまり多く実行しないようにしてください。 RPC 呼び出しやメッセージ キュー操作などの一部の非 DB 操作をトランザクションの外部に配置するようにしてください。

mysql5.7 に基づくソリューション

  • InnoDB トランザクションでは、行ロックは必要な場合にのみ追加されますが、不要になったときにすぐには解放されません。代わりに、トランザクションが終了したときにのみ解放されます。 **トランザクションで複数の行をロックする必要がある場合は、ロックの競合を引き起こし、同時実行性に影響を与える可能性が最も高いロックをできるだけ後ろに配置します**
  • SETMAX_EXECUTION_TIME コマンドを使用して、各ステートメントの最大クエリ時間を制御し、単一のステートメントによるクエリが誤って長時間実行されるのを防ぎます。
  • information_schema.Innodb_trxテーブルを監視し、長いトランザクションのしきい値を設定し、それを超過すると警告または強制終了する
  • 業務機能のテストフェーズでは、すべての general_logs を出力し、ログの動作を分析して事前に問題を見つける必要があります。
  • innodb_undo_tablespaces 値を設定して、UNDO ログを別のテーブルスペースに分離します。大規模なトランザクションによってロールバック セグメントが大きくなりすぎる場合は、設定後にクリーンアップする方が簡単になります。

付録 クエリトランザクション関連ステートメント

**注**: SQL文はMySQL 5.7バージョンに基づいています

# 実行中のすべてのトランザクションとその実行時間を照会します。 select t.\*,to\_seconds(now())-to\_seconds(t.trx\_started) idol\_time from INFORMATION\_SCHEMA.INNODB\_TRX t



# トランザクションの詳細と実行されたSQLを照会する

information\_schema.innodb\_trx a から now(),(UNIX\_TIMESTAMP(now()) - UNIX\_TIMESTAMP(a.trx\_started)) diff\_sec,b.id,b.user,b.host,b.db,d.SQL\_TEXT を選択し、information\_schema.innodb\_trx a を内部結合し information\_schema.PROCESSLIST b を生成します。

a.TRX\_MYSQL\_THREAD\_ID=b.id かつ b.command = 'Sleep' の場合

内部結合パフォーマンス\_schema.threads c ON b.id = c.PROCESSLIST\_ID

内部結合 performance\_schema.events\_statements\_current d ON d.THREAD\_ID = c.THREAD\_ID;



# トランザクションによって実行されたすべての履歴SQLレコードをクエリする SELECT

 ps.id 'プロセスID'、

 追伸:ユーザー様、

 追伸:ホスト、

 esh.EVENT_ID、

 trx.trx_started、

 esh.event\_name 'イベント名',

 esh.sql\_text 'SQL'、

 追伸時間 

から

 パフォーマンス\_SCHEMA.イベント\_ステートメント\_履歴 esh

 PERFORMANCE\_SCHEMA.threads th を esh.thread\_id = th.thread\_id に結合します

 information\_schema.PROCESSLIST ps を ps.id = th.processlist\_id に結合します。

 LEFT JOIN information\_schema.innodb\_trx trx ON trx.trx\_mysql\_thread\_id = ps.id 

どこ

 trx.trx_id は NULL ではありません 

 かつ ps.USER != 'SYSTEM\_USER' 

注文する

 esh.EVENT_ID;

 

 # 単純なクエリトランザクションロック select \* from sys.innodb\_lock\_waits

 

 #トランザクションロックの詳細を照会するSELECT

 tmp.\*,

 c.SQL\_テキストブロッキング\_sql\_text、

 p.HOST ブロッキング\_ホスト 

から

 (

 選択

 r.trx_state 監視中のtrx_state、

 r.trx_id 待機中のtrx_id、

 r.trx\_mysql\_thread\_Id 待機中\_スレッド、

 r.trx_query 待機クエリ、

 b.trx_state ブロッキングtrx_state、

 b.trx_id ブロッキングtrx_id、

 b.trx\_mysql\_thread\_id ブロッキング\_スレッド、

 b.trx_query ブロッキングクエリ 

 から

 情報\_schema.innodb\_lock\_waits w

 INNER JOIN information\_schema.innodb\_trx b ON b.trx\_id = w.blocking\_trx\_id

 INNER JOIN information\_schema.innodb\_trx r ON r.trx\_id = w.requesting\_trx\_id 

 ) 一時、

 情報\_schema.PROCESSLIST p、

 パフォーマンス\_SCHEMA.イベント\_ステートメント\_現在のc、

 PERFORMANCE\_SCHEMA.threads t 

どこ

 tmp.blocking_thread = p.id 

 かつ t.thread_id = c.THREAD_ID 

 かつ t.PROCESSLIST_ID = p.id

上記は、MySQL で大規模トランザクションを回避する方法と大規模トランザクションを解決する方法の詳細です。MySQL の大規模トランザクションの詳細については、123WORDPRESS.COM の他の関連記事に注目してください。

以下もご興味があるかもしれません:
  • MySQLにおけるトランザクション分離レベルの実装原理の詳細な説明
  • MySQLトランザクションを実行するための構文とプロセスの詳細な説明
  • mysql と oracle のデフォルトのトランザクション分離レベルの説明
  • MySQL トランザクション自動コミット自動コミット操作
  • トランザクションとロックを表示するための MySQL の一般的なステートメント
  • MySQL マスタースレーブ同期、トランザクションロールバックの実装原理
  • MySQLデータベースのトランザクションとロックの詳細な分析
  • Mysql トランザクションで Update を実行するとテーブルがロックされますか?
  • PHP+MySQL 分散トランザクションとソリューションに関する深い理解
  • MySQL は ACID トランザクションをどのように実装しますか?
  • MySQLにおけるトランザクションの永続性実装原理の詳細な説明

<<:  単一マシン上での Tomcat の複数インスタンスの実装

>>:  ReactプロジェクトでのTypeScriptの実装

推薦する

MySQL シリーズ 14 MySQL 高可用性実装

1. 内閣府マスターノードを監視することで、他のスレーブノードへの自動フェイルオーバーを実現できます...

HTML マーキー文字フラグメントのスクロール

その特性は次のとおりです。方向アクティブな字幕のスクロール方向を設定するコードは次のとおりです。 &...

CSSはインラインブロックのずれの問題を解決します

もうナンセンスじゃない、郵便番号HTML部分 <div class="positio...

重複したMySQLテーブルをマージして削除する簡単な方法

シナリオ:クロールされたデータは、別のメインテーブルと同じ構造を持つデータテーブルを生成するため、マ...

CSS はモバイル互換性の問題を解決するために 0.5px の線を実装します (推奨)

【コンテンツ】: 1.背景画像のグラデーションスタイルを使用する2. スケールを使ってズームできる...

JSアルバム画像の揺れと拡大表示効果のサンプルコード

前回の記事では、JS を使って簡単な揺れ効果を実現する方法を紹介しました。ご興味があればクリックして...

各 Nginx プロセスで開くことができるファイルの最大数を設定する方法

1. システム内で開いているファイルの最大数を確認する #現在のリソース制限設定を表示する ulim...

HTMLプログラミングタグとドキュメント構造の詳細な説明

HTML を使用してコンテンツをマークアップする目的は、Web ページにセマンティクスを与えることで...

CSS で順序付きリスト項目と順序なしリスト項目のスタイルを設定する方法

順序なしリストでは、順序なしリストのシンボルは各リストの前に表示されるドットです。順序付きリスト o...

開発効率を向上させる 20 の JavaScript ヒント

目次1. 配列を宣言して初期化する2. 合計、最小値、最大値を計算する3. 文字列、数値、オブジェク...

Xmeter APIインターフェーステストツールの使用状況の分析

XMeter API は、以下のサービスを含む、JMeter に基づくワンストップのオンライン イン...

タグが新しいページを開くかどうかという問題。主要ウェブサイトの開設状況をまとめました

a タグが新しいページを開くかどうか: (1)百度百科事典:ヘッダーが異なる場合は新しいページが開き...

Access_Tokenの統合管理を実現するミニプログラム開発

目次TOKEN タイマーリフレッシュ2. access_tokenの内部設計2.1 access_t...

Linux でハイパースレッディング技術を動的に有効/無効にする方法の詳細な説明

序文Intel のハイパースレッディング テクノロジーにより、1 つの物理コア上で 2 つのスレッド...