ロックの問題
13.1 ロック待機ステータスの取得
table_locks_waited および table_locks_immediate ステータス変数をチェックすることで、システム上のテーブル ロック競合を分析できます:
mysql> show status like 'Table%';
+---------- -- -------+----------+
値 |
+---------- -- ---+----------+
| テーブル ロック_即時 |
| テーブル ロック_待機中 | -- --------------------+----------+
2行セット(0.00秒)
をチェックすることで分析可能Innodb_row_lock ステータス変数 システム上の行ロックの競合:
mysql> show status like 'innodb_row_lock%';
+-------------------------- - ------------+----------+
| 値 |
+----------------- - ------------+----------+
| Innodb_row_lock_current_waits | 2001 |
| Innodb_row_lock_time_avg |
| 845 |
+-------------------------------- -- ------+----------+
5 行セット (0.00 秒)
さらに、Innodb タイプのテーブルの場合、現在のロック待機ステータスを確認する必要がある場合は、 InnoDB モニターを設定できます。次に、Show innodb status を確認します。設定方法は次のとおりです:
CREATE TABLE innodb_monitor(a INT) ENGINE=INNODB;
以下のステートメントを発行することでモニターを停止できます:
DROP TABLE innodb_monitor;
show innodb のモニター ステータス表示には、さらなる分析と問題判別を容易にするために、テーブル名、ロック タイプ、ロック レコード ステータスなどを含む、待機中の現在のロックに関する詳細情報が表示されます。モニターを開いた後、デフォルトでは監視内容が 15 秒ごとにログに記録されます。そのため、モニターを長時間開いていると、.err ファイルが非常に大きくなります。そのため、問題の原因を確認した後、監視テーブルを閉じるには、必ず監視テーブルを削除する必要があります。または、 --console オプションを使用してサーバーを起動し、ログ ファイルの書き込みをオフにします。
13.2 テーブル ロックはどのような場合に使用しますか? 以下の状況では、テーブル レベルのロックが行レベルのロックよりも優れています:
1. 多くの操作はテーブルの読み取りです。
2. 更新または削除を別のインデックスを使用して読み取ることができる場合、厳密に条件付きのインデックスで読み取りと更新を行います。
4. DELETE FROM tbl_name WHERE unique_key_col=key_value; 5. SELECT 文と INSERT 文は同時に実行されますが、UPDATE 文と DELETE 文は少数です。
6. テーブル全体に対して多くのテーブル スキャンと GROUP BY 操作が行われますが、テーブルへの書き込みは行われません。
13.3 行ロックを使用する場合 行レベルのロックの利点:
1. 多くのスレッドで異なる行にアクセスする場合、ロックの競合はほとんどありません。
2. ロールバック時の変更はわずかです。
3. 単一行を長時間ロックできます。
行レベルのロックの欠点:
1. ページ レベルまたはテーブル レベルのロックよりも多くのメモリを消費します。
2. テーブルの大部分で使用すると、より多くのロックを取得する必要があるため、ページレベルまたはテーブルレベルのロックよりも遅くなります。
3. ほとんどのデータに対して GROUP BY 操作を頻繁に実行する場合、またはテーブル全体を頻繁にスキャンする必要がある場合、他のロックよりも大幅に遅くなります。
4. 高レベルのロックでは、さまざまなタイプのロックをサポートすることで、ロックのコストが行レベルのロックよりも低いため、アプリケーションを簡単に調整することもできます。
上記は mysql のロック問題の内容です。その他の関連記事については、PHP 中国語 Web サイト (www.php.cn) に注目してください。