方法: 1. 「show OPEN TABLES where In_use > 0;」コマンドを使用して、テーブルのロック状態を確認します。 2. 「SELECT * FROM INFORMATION_SCHEMA.INNODB_LOCKS」コマンドを使用して、ロックされた状態をクエリします。テーブル。
このチュートリアルの動作環境: Windows10 システム、mysql8.0.22 バージョン、Dell G3 コンピューター。
mysql はロックされたテーブルをどのようにクエリしますか
#1. テーブルがロックされているかどうかを確認します:
(1) 直接Mysql コマンドライン実行時: show Engine innodb status\G。
(2) デッドロックの原因となったSQL文を確認し、インデックスの状況を分析し、SQLを最適化します。
(3) 次に、show processlist を実行して、デッドロックに時間がかかる SQL 文を確認します。
(4)「%lock%」のようなステータスを表示します。
2. テーブル ロック ステータスを確認し、デッドロック ステップを終了します:
(1) テーブル ロック ステータスを確認します: show OPEN TABLES where In_use > 0; このステートメントは、現在のロック テーブル ステータスを記録します。 。
(2) プロセスのクエリ: show processlist クエリ テーブル ロックされたプロセス; 対応するプロセスの killid をクエリします。
(3) テーブルをロックする SQL を分析します。対応する SQL を分析し、テーブルにインデックスを追加し、共通フィールドにインデックスを追加し、テーブル関連フィールドにインデックスを追加します。
(4) 何がロックされているかを確認します: SELECT * FROM INFORMATION_SCHEMA.INNODB_LOCKS。
(5) ロックを待機しているものを表示します: SELECT * FROM INFORMATION_SCHEMA.INNODB_LOCK_WAITS。
拡張情報
MySQL ロック ステータス表示コマンド:
テーブルのチェック: データ テーブルをチェックしています (これは自動です)。
テーブルを閉じる: テーブル内の変更されたデータはディスクにフラッシュされ、使用済みのテーブルは閉じられます。これは簡単な操作ですが、そうでない場合は、ディスク領域がいっぱいであるか、ディスクに高い負荷がかかっているかを確認する必要があります。
接続出力: レプリケーション スレーブ サーバーがマスター サーバーに接続しています。
ディスク上の tmp テーブルにコピーしています: 一時的な結果セットが tmp_table_size より大きいため、メモリを節約するために一時テーブルがメモリ ストレージからディスク ストレージに変換されています。
Creating tmp table: クエリ結果を保存するために一時テーブルを作成しています。
メインテーブルからの削除: サーバーは複数テーブルの削除の最初の部分を実行中で、最初のテーブルを削除したところです。
参照テーブルからの削除: サーバーは複数テーブルの削除の 2 番目の部分を実行し、他のテーブルからレコードを削除しています。
テーブルのフラッシュ: FLUSH TABLES が実行されており、他のスレッドがデータ テーブルを閉じるのを待っています。
Killed: kill リクエストがスレッドに送信されると、スレッドは kill フラグをチェックし、次の kill リクエストを放棄します。 MySQL は各メイン ループで kill フラグをチェックしますが、場合によっては、スレッドが短期間で終了する可能性があります。スレッドが別のスレッドによってロックされている場合、kill リクエストはロックが解放されるとすぐに有効になります。
ロック: 他のクエリによってロックされています。
データの送信: SELECT クエリのレコードが処理され、結果がクライアントに送信されます。
グループの並べ替え: GROUP BY の並べ替え。
順序の並べ替え: ORDER BY の並べ替え。
テーブルを開く: 他の要因によって妨げられない限り、このプロセスは高速である必要があります。たとえば、ALTER TABLE または LOCK TABLE ステートメントが実行されるまで、他のスレッドでデータ テーブルを開くことはできません。テーブルを開こうとしています。
重複の削除: SELECT DISTINCT クエリが実行されていますが、MySQL は前の段階で重複レコードを最適化できません。したがって、MySQL は結果をクライアントに送信する前に重複レコードを再度削除する必要があります。
テーブルを再オープン: テーブルのロックが取得されましたが、テーブル構造が変更されるまでロックを取得できません。ロックが解放され、データ テーブルが閉じられ、データ テーブルを再度オープンしようとしました。
ソートによる修復: 修復ディレクティブは、インデックスを作成するためにソートしています。
キーキャッシュによる修復: 修復ディレクティブは、インデックス キャッシュを利用して新しいインデックスを 1 つずつ作成します。ソートによる修復よりも遅くなります。
更新対象行の検索: 更新条件を満たすレコードを検索します。 UPDATE が関連レコードを変更する前に完了する必要があります。
スリープ中: クライアントが新しいリクエストを送信するのを待っています。
システム ロック: 外部システム ロックの取得を待機しています。現在、同じテーブルを同時にリクエストする複数の mysqld サーバーを実行していない場合は、 --skip-external-locking パラメーターを追加して外部システム ロックを無効にすることができます。
ロックをアップグレードしています: INSERT DELAYED は、新しいレコードを挿入するためのロック テーブルを取得しようとしています。
更新: 一致するレコードを検索し、それらを変更します。ユーザー ロック: GET_LOCK() を待機しています。
テーブルを待機中: データ テーブル構造が変更されたため、新しい構造を取得するにはデータ テーブルを再度開く必要があることがスレッドに通知されます。その後、データ テーブルを再度開くには、他のすべてのスレッドがテーブルを閉じるまで待つ必要があります。
ハンドラー挿入を待機中: INSERT DELAYED は保留中の挿入操作をすべて処理し、新しい要求を待機しています。
推奨学習: mysql ビデオ チュートリアル
以上がmysqlでロックされたテーブルをクエリする方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。