MySQL がデータの削除と挿入に非常に時間がかかる問題の解決策

MySQL がデータの削除と挿入に非常に時間がかかる問題の解決策

会社の開発者がテスト環境で挿入ステートメントを実行すると、正常に実行されるまでに 10 秒以上かかります。テスト環境のデータベースパフォーマンス、データ量、デッドロックなどの情報を確認しましたが、異常は見つかりませんでした。最終的に、ログの書き込み方法を変更することでこの問題は解決されました。

1. 変更方法

/etc/my.cnf ファイルを変更し、innodb_flush_log_at_trx_commit = 1 を 0 に変更します。ただし、これにより、データベースがクラッシュしてから 1 秒以内にデータベースに保存されていないデータが失われるリスクが発生します。 MySQL のドキュメントでは、このパラメータについて次のように説明されています。

innodb_flush_log_at_trx_commit の値が 0 の場合、ログ バッファーは 1 秒ごとにログ ファイルに書き出され、ログ ファイルに対してディスクへのフラッシュ操作が実行されますが、トランザクションのコミット時には何も行われません。値が 1 (デフォルト) の場合、ログ バッファーはトランザクションのコミットごとにログ ファイルに書き出され、ログ ファイルに対してディスクへのフラッシュ操作が実行されます。値が 2 の場合、ログ バッファーはコミットごとにファイルに書き出されますが、ディスクへのフラッシュ操作は実行されません。ただし、値が 2 の場合でも、ログ ファイルのフラッシュは 1 秒ごとに実行されます。プロセスのスケジュールの問題により、1 秒ごとに 1 回のフラッシュが毎秒実行されるとは限らないことに注意してください。

2. パラメータの説明

  • 0: ログ バッファは 1 秒ごとにログ ファイルに書き込まれ、同時にログ ファイルがフラッシュ (ディスクにフラッシュ) されます。このモードでは、トランザクションがコミットされても、ディスクへの書き込み操作はアクティブにトリガーされません。
  • 1: トランザクションがコミットされるたびに、MySQL はログ バッファ内のデータをログ ファイルに書き込み、ディスクにフラッシュします。このモードはシステムのデフォルトです。
  • 2: トランザクションがコミットされるたびに、MySQL はログ バッファー内のデータをログ ファイルに書き込みますが、同時にフラッシュ操作は実行されません。このモードでは、MySQL は 1 秒ごとにフラッシュ操作を実行します。

3. 注意事項

0 に設定すると、このモードは最も高速になりますが、安全性は低くなります。mysqld プロセスがクラッシュすると、最後の 1 秒間のすべてのトランザクション データが失われます。

1 に設定すると、このモードは最も安全ですが、最も遅くなります。 mysqld サービスまたはサーバー ホストがクラッシュした場合、バイナリ ログでは最大 1 つのステートメントまたは 1 つのトランザクションが失われる可能性があります。

2 に設定すると、このモードは 0 よりも高速かつ安全になります。最後の 1 秒間のすべてのトランザクション データは、オペレーティング システムがクラッシュした場合、またはシステムの電源が失われた場合にのみ失われる可能性があります。

2 つのパラメータ innodb_flush_log_at_trx_commit と sync_binlog は、MySQL ディスク書き込み戦略とデータ セキュリティを制御するための重要なパラメータです。両方のパラメータを 1 に設定すると、書き込みパフォーマンスが最悪になります。推奨される方法は、innodb_flush_log_at_trx_commit=2、sync_binlog=500 または 1000 です。

これで、MySQL のデータの削除と挿入が非常に遅い問題を解決する方法についての記事は終わりです。MySQL のデータの削除と挿入が非常に遅いことに関する関連コンテンツの詳細については、123WORDPRESS.COM の以前の記事を検索するか、以下の関連記事を引き続き参照してください。今後とも 123WORDPRESS.COM をよろしくお願いいたします。

以下もご興味があるかもしれません:
  • Navicat の MySQL へのリモート接続が遅い理由の詳細な説明
  • MySQLクエリが遅い場合の理由と解決策
  • MySQL データベースへのリモート接続が遅い場合の解決策
  • MySQLがデータを送信することによって引き起こされるクエリの遅延の問題を解決する方法とアイデア
  • MySQL へのリモート接続が遅い問題を解決する方法 (mysql_connect が接続をゆっくり開く)
  • MySQL ドメイン名解決を無効にする (MySQL へのリモート アクセスが遅い問題を解決するため)

<<:  ウェブサイトのビジュアルデザインパスはユーザーの習慣に合わせる必要がある

>>:  リアルタイムコンピューティングフレームワークFlinkクラスタの構築と動作メカニズムについての簡単な説明

推薦する

MySQLの明示的な型変換の簡単な分析

CAST関数前回の記事では、型変換を表示するために使用する CAST 関数について説明しました。暗黙...

MySQL は、元のデータと同じデータがある場合、更新ステートメントを再度実行しますか?

背景この記事では主に、MySQL が更新ステートメントを実行するときに、元のデータと同一の (つまり...

MySQL がタイムスタンプを使用するときにタイムゾーンの問題を無視できるのはなぜですか?

私はいつも、なぜMySQLデータベースのtimestampタイムゾーンの問題を無視できるのか疑問に思...

Linux でファイル権限を変更する chmod コマンドの詳細な分析

Linux chmodコマンドを使用して、ターゲット ファイルにアクセス、読み取り、書き込み、または...

設定ファイルを書いてMyBatisを簡単に使う方法

設定ファイルを書いてMyBatisを簡単に使う方法マイバティス3.xここでは MyBatis につい...

Docker イメージに基づいて Go プロジェクトをデプロイする方法と手順

知識への依存Go クロスコンパイルの基礎Dockerの基礎Dockerfileカスタムイメージの基本...

MySQL 5.7.17 のインストールと設定方法のグラフィックチュートリアル (Win7 の場合)

Windows 7 で MySQL 5.7.17 をインストールする方法についてのグラフィック チ...

Linux での UDP について学ぶ

目次1. UDPとLinuxの基礎の紹介2. 各機能の使い方1. ソケット機能の使用2. バインド機...

Webフロントエンド開発CSS関連チームコラボレーション

フロントエンド開発部門は成長し、スタッフも増加し、技術も向上しています。 CSSer はフロントエン...

Linuxにpipパッケージをインストールする方法

1. システムの Python バージョンに応じて、pip インストール パッケージをダウンロードし...

DockerでRedisを使用するための詳細な手順

1. はじめにこの記事では、Docker を使用して Redis を探索する方法を説明します。 Do...

vue3.0 プロジェクトを素早く構築するための手順を完了する

目次1. 3.0をより適切にサポートするには、vue/cliのバージョンが4.5.0以上であることを...

JavaScript キャンバス テトリス ゲーム

テトリスは非常に古典的な小さなゲームで、私もそれを書いてみました。しかし、できるだけ簡潔で論理的なコ...

Centos7 に MySQL 8.0.23 をインストールする手順 (初心者レベル)

まず、MySQL とは何かを簡単に紹介します。簡単に言えば、データベースはデータを格納するための倉庫...

要素を中央に配置するための配置方法 (Web ページ レイアウトのヒント)

ブラウザウィンドウの中央に要素を配置する方法まず、コード ブロックを示します。すでにコードを理解して...