MySQLはイベントを使用してスケジュールされたタスクを完了します

MySQLはイベントを使用してスケジュールされたタスクを完了します

イベントでは、SQL コードを 1 回または一定の間隔で実行することを指定できます。通常、複雑な SQL ステートメントはストアド プロシージャを使用してカプセル化され、特定のタスクを完了するためにストアド プロシージャが定期的に呼び出されます。

イベントはサーバー接続を確立する必要はありませんが、別のイベント スケジューラ スレッドを通じて初期化されます。接続がなければ入力も出力もないため、イベントには入力パラメータも戻り値もありません。有効にすると、サーバー ログを通じて実行された命令を表示できますが、それがどの特定のイベントからのものであるかを知ることは困難です。また、INFORMATION_SCHEMA.EVENTS テーブルをクエリして、イベントのステータス (最新の実行時刻など) を確認することもできます。

ストアド プロシージャと同様に、イベントでも同様の問題を考慮する必要があります。まず、イベントは MySQL サーバーに余分な作業を追加します。イベント自体のペイロードは小さいですが、イベントによって呼び出される SQL ステートメントはパフォーマンスに重大な影響を及ぼす可能性があります。さらに、イベントにも、ステートメントベースのレプリケーションによって発生するストアド プロシージャと同じ問題が発生します。イベントの適切な用途としては、定期的なメンテナンス タスク、キャッシュの再構築、データ統計、監視および診断のためのステータス値の保存などのタスクがあります。

次の例では、指定されたデータベースで毎週テーブル最適化を実行するストアド プロシージャを呼び出すイベントを作成します。

1 週間ごとにスケジュールされたイベント optimize_somedb ON を作成する
する 
optimize_tables('somedb') を呼び出します。

イベントを繰り返す必要があるかどうかを指定できます。場合によってはこれで問題ありませんが、そうでない場合もあります。上記の例を使用すると、すべてのレプリカで OPTIMIZE TABLE コマンドを実行することができます。ただし、すべてのレプリカがこの操作を同時に実行すると、サーバー全体のパフォーマンスに影響することに注意してください (たとえば、テーブルのロック)。 さらに、定期的なイベントは完了するまでに長い時間がかかる場合があり、次のイベントが完了する前に新しいイベントの実行が開始される可能性もあります。 MySQL ではこの状況を防ぐことはできないため、同じタスクの排他性を実装するには独自のコードを記述する必要があります。これはロックを使用することで実現できます:

1 週間ごとにスケジュールされたイベント optimize_somedb ON を作成する
する 
始める
	SQLEXCEPTION の継続ハンドラを宣言する
  	始まり 終わり;
  GET_LOCK('somedb', 0)の場合
  	optimize_tables('some_db') を呼び出します。
  終了の場合;
  RELEASE_LOCK('somedb')を実行します。
終わり

一見「冗長」な継続ハンドラは、例外が発生した場合でもロックが解除されることを保証します。

イベントは接続とは関係ありませんが、スレッドとは関係があります。 MySQL サーバーには、サーバー構成で有効にできるメイン イベント ディスパッチ スレッドがあります。

グローバルイベントハンドラを 1 に設定します。

有効にすると、このスレッドはスケジューラで指定されたイベントを実行します。サーバーのエラー ログを表示して、イベント実行に関する情報を取得できます。

イベント スケジューラはシングル スレッドですが、イベント自体は同時に実行できます。イベントが実行されるたびに、サーバーは新しいプロセスを作成します。イベント内では、CONNECTION_ID() を呼び出して一意の値を取得できます (実際の接続がない場合でも)。実際に返されるのはスレッド ID です。イベントが実行されると、プロセスとスレッドは破棄されます。 SHOW PROCESSLIST で確認でき、コマンド列に Connect として表示されます。

プロセスは実際にイベントを実行するスレッドを作成しますが、イベントが完了するとスレッドは破棄され、キャッシュに配置されないため、Threads_created ステータス カウンターは増加しません。

結論: アプリケーションまたはオペレーティング システム レベルのスケジュールされたタスクと比較すると、イベントは SQL 接続確立プロセスがないため、より効率的でコストが低くなります。データ テーブルの最適化、統計レポート データの生成など、定期的に実行する必要がある SQL スクリプト タスクに適用できます。ただし、イベント自体に同時実行の問題が発生する可能性があり、これはロックによって解決できることに注意してください。同時に、イベントを繰り返し実行する必要がある場合は、複雑すぎて時間のかかるタスクを実行しないことをお勧めします。

上記は、MySQL がイベントを使用してスケジュールされたタスクを完了する方法の詳細です。MySQL がイベントを使用してスケジュールされたタスクを完了する方法の詳細については、123WORDPRESS.COM の他の関連記事に注目してください。

以下もご興味があるかもしれません:
  • MySQL ストアド プロシージャ、トリガー、イベント スケジューラの入門ガイド
  • 初心者から熟練者まで使えるMySQLデータベーストリガー
  • MySQLトリガートリガー例の詳細な説明
  • MySQL トリガーの使用方法と利点と欠点の紹介
  • バックアップと削除のためにリアルタイムでステートメントを検出するMySQLトリガーの考え方の詳細な説明
  • MySQL スケジュールタスク (EVENT イベント) を詳細に設定する方法
  • MySQLのイベントスケジューラEVENTを理解する
  • MySQL の計画タスクとイベント スケジュール例の分析
  • MySQL イベントとトリガーのトピックの絞り込み

<<:  React Router 5.1.0 はページジャンプナビゲーションを実装するために useHistory を使用します

>>:  Zabbix による VMware Exsi ホストの監視のグラフィカルな手順

推薦する

InnoDB がシリアル化分離レベルを実装する方法

シリアル化の実装InnoDB は 2 つの方法でシリアル化を実装します。まず、SELECT 文が明示...

2列の水平タイムラインを実装するためのVueサンプルコード

目次1.コンポーネントtimelineH.vueを実装する2. コンポーネントの呼び出しこの記事では...

CentOSバージョンにDockerをインストールする際のエラーの解決方法

1. バージョン情報 # cat /etc/system-release CentOS Linux ...

sql_mode を変更する際の MySQL エラーの解決方法

目次ERR 1067による殺人事件2番目の問題の原因はsql_modeです3. sql_modeを設...

Linuxディレクトリ構造の詳細な紹介

Linuxを学び始めるときは、まずLinuxの標準ディレクトリ構造を理解する必要があります。 / r...

Vueカスタムカプセル化ボタンコンポーネント

Vueボタンコンポーネントのカスタムカプセル化コードは参考用です。具体的な内容は次のとおりです。ボタ...

Vue は PC カメラを呼び出してリアルタイムで写真を撮る機能を実装します

VueはPCカメラを呼び出してリアルタイムで写真を撮影します。参考までに、具体的な内容は次のとおりで...

Centos7 サーバーで jar パッケージ プロジェクトを開始する最良の方法

序文Linux 上で jar パッケージを実行する方法は誰もが知っています。なぜ別々に話したいのでし...

デザイン理論:フォントデザインの基礎

<br />言葉は、人間の思考や感情を伝えるために必然的に生み出されるものです。人類の文...

大規模なウェブサイトアーキテクチャを設計・構築する際に考慮すべき10の課題

ここでは、PHP、JSP、または .NET 環境については説明しません。アーキテクチャの観点から問題...

vue3 キャッシュページキープアライブと統合ルーティング処理の詳細な説明

目次1. はじめに2. 使用1. vue2とvue3の違い2. ページ上の一部のデータはキャッシュす...

別の種類の「キャンセル」ボタン

「キャンセル」ボタンは必要な操作プロセスの一部ではなく、デザイン上の主要な要素として表示されません...

Nginx try_files ディレクティブの使用例

Nginx の設定構文は柔軟で、高度に制御可能です。バージョン 0.7 以降では、try_files...

MySQL 5.7.20 Green Edition のインストールの詳細なグラフィックチュートリアル

まず、MySQL とは何かを理解しましょう。 MySQL は、スウェーデンの会社 MySQL AB ...

CentOS7.5 MySQLのインストールチュートリアル

1. まずシステムにmysqlがインストールされているかどうかを確認します rpm -qa | gr...