テーブルレベルのロックが大きなテーブル用の行レベルのロックよりも優れているのはなぜですか?
-
27-09-2019 - |
質問
による mysqlマニュアル:
大きなテーブルの場合、テーブルロックはしばしば列のロックよりも優れています。
どうしてこれなの?大きなテーブルをロックすると、より多くのデータをロックしているため、行レベルのロックが優れていると思います。
解決
(edit pre-edit)から リンク
テーブルの大部分で使用すると、ページレベルまたはテーブルレベルのロックよりも遅いので、さらに多くのロックを取得する必要があるため
1つか2つの行を押している場合は、行レベルロックを使用します。コードが多くの行または不明な行にヒットした場合は、テーブルロックに固執します。
他のヒント
行ロックには、テーブルまたはページレベルのロックよりも多くのメモリが必要です。
より多くのリソースを消費する行ロックでさらに多くのロックを取得する必要があります
から http://www.devshed.com/c/a/mysql/mysql-optimization-part-2/
行レベルのロックの利点:
- 多くのスレッドで異なる行にアクセスする場合、ロックの競合が少なくなります。
- ロールバックの変更が少ない。
- 長い間、1列をロックすることを可能にします。
行レベルのロックの短所:
- ページレベルまたはテーブルレベルのロックよりも多くのメモリを取得します。
- より多くのロックを取得する必要があるため、テーブルの大部分で使用する場合、ページレベルまたはテーブルレベルのロックよりも遅いです。
- データの大部分で操作ごとにグループを頻繁に行う場合、またはテーブル全体をスキャンする必要がある場合は、他のロックよりもはるかに悪いです。
- 高レベルのロックを使用すると、ロックオーバーヘッドは行レベルのロックよりも小さいため、さまざまなタイプのロックをより簡単にサポートしてアプリケーションを調整することもできます。
テーブルロックは、次の場合には、ページレベルまたは行レベルのロックよりも優れています。
- 表のほとんどのステートメントは読み取りです。
- Strict Keysを読み取り、更新します。単一のキー読み取りで取得できる行を更新または削除します。
UPDATE tbl_name SET column=value WHERE unique_key_col=key_value;
DELETE FROM tbl_name WHERE unique_key_col=key_value;
- 並行した挿入ステートメントと組み合わせて選択し、ステートメントを更新および削除することはほとんどありません。
- 作家なしでテーブル全体の操作ごとに多くのスキャンまたはグループ。
a 行 テーブルレベルのロックは、主要なデータ変更が行われている大きなテーブルに適しています。これにより、システムは、膨大な数のロック(各行に1つ)を処理する必要があるのではなく、テーブルの単一のロックと競合できます。
RDBMSは、内部でロックレベルを自動的にエスカレートします。
テーブルロックにより、多くのセッションが同時にテーブルから読むことができます
非常に高いロック速度を達成するために、MySQLはテーブルロックを使用します
「私は、列レベルのロックが優れていると思います」[データを少なくロック]。
最初の「より良い」は、このページではあまり定義されていません。 「より速い」という方が良いと思われます。
ロックの競合のため、行レベルのロックは(一般的に)速くすることはできません。大規模な結果セットの各行をロックすることは、別の大規模な結果セットクエリとロールバックとの競合の非常に現実的な可能性を意味します。
一般に、多くのデータをロックする必要がある場合は、1つの大きなテーブルのロックが行レベルまたはページロックの束よりも安価です