MySQLのテーブルロック溶液

https://blog.csdn.net/a5582ddff/article/details/79566678

MySQLのテーブルロック溶液

まず、私のプロセス

1、調査プロセス、プロセスがロックされている主IDルックアップ・テーブル

SHOWのPROCESSLIST。

図2に示すように、プロセスは、ロックテーブルIDを殺します

10866 KILL; IDの後ろに//デジタルインスタントプロセスを

ビットを理解するために、いくつかの情報を見つけるためにオンラインで、最初は共有します:

二、MySQLのロックテーブルの問題

SHOW PROCESSLISTは、かどうかロックをデータベーステーブルのステータスを表示する、
上記ID //テーブルがロックされて殺す殺す
=========================== ========================
;自動コミット= 0 SET
インデックス付け(例えば、UID)のUID = 'XXXX' //更新T1からSELECT *を行がロックされている場合には、そうでない場合は、テーブルロックである
T1値にINSERT(1「XXXXX」);
COMMIT;
========================= ============================
;読む|ロックがテーブルT1を書く
INSERT INTO T1値(2 'XXXXX'); //のみINSERTは、
テーブルのロックを解除します。

2「MySQLデータベースを簡単にロック機構の関連原則を把握します。」

BDBテーブルページレベルのロック、行レベルのロッキングでInnoDBテーブル用のテーブル・レベルのロッキングのためのMyISAMとMEMORYテーブルのためのMySQL 5.1サポート。多くの場合、あなたは他よりも優れて与えられたロックの種類を与えるために、アプリケーションに基づいてトレーニング最良の推測のロックタイプのどのタイプを使用していますが、一般的に非常に難しいことができます。すべてはアプリケーションに依存して、アプリケーションのさまざまな部分は、さまざまなタイプのロックを必要とするかもしれません。あなたは、行レベルのロックを使用するストレージエンジンかどうかを判断し、アプリケーションが何をすべきかを見るためには、何を選択し、更新ステートメントをミックス。ほとんどのWebアプリケーションは多くの選択肢を実行すると、稀に削除されていない例えば、キーの値のみが更新され、特定のテーブルの挿入ごく少量の。基本的なMySQLのMyISAMテーブルのセットアップは非常によく調整されます。

テーブル・レベルのロッキングストレージエンジンを使用するMySQLでは、テーブルが場合デッドロックはありませんロック。これは、常にクエリ要求は、すべての必要なロックとは、同じ順序でテーブルをロックしたときに、必ずすぐに開始することで管理されています。

次のように原則テーブルロック方法のWRITEは、MySQLが使用しました:

◆テーブルにロックがない場合は、書き込みロックの上にそれを置きます。
◆それ以外の場合は、書き込みロックキューにロック要求。

原則READ、MySQLはロック方法を使用して、次のとおりです。

◆テーブル上にwriteロックがない場合は、その上に読み取りロックを置きます。
◆それ以外の場合は、読み取りロックキューにロック要求。

ロックが解除されると、ロックがスレッドに書き込むことができますキュー、その後読み取りロックキューのスレッドがロックされます。

これは、あなたがテーブルの上に多くの更新がある場合は、それ以上の更新がなくなるまで、SELECTステートメントが待機することを意味します。

INSERT文が競合しない場合は、ロックを必要とせずに並列にMyISAMテーブルのINSERTおよびSELECTステートメントのために自由に混合することができます。

InnoDBはBDBはページロックを使用して、行ロックを使用しています。両方のストレージエンジンの場合、デッドロックが存在する可能性があります。SQL文の処理中に、InnoDBの行は、自動的にロックBDBはページロックを取得するのではなく、トランザクションの開始に得るためです。

行レベルロックの利点:

•多くのスレッドで異なる行にアクセスする場合、ロックの競合の少量のみがあります。
・変更のロールバックの数が少ないです。
•あなたは、単一の行に長い時間をロックすることができます。

行レベルのロックの欠点:

・ページレベル以上のメモリをロックテーブル・レベルよりも。
・あなたがより多くのロックを取得する必要があるため、ページレベルまたはテーブルレベルのロックは、遅いよりも、テーブルのほとんどで使用する場合。
データの大部分または上の操作BY場合、頻繁GROUPは常に明らかにはるかに遅い他のロックよりも、テーブル全体をスキャンする必要があります。
それは、行レベルのロックよりも少ないコストロックするため*高レベルのロックは、ロックの種類をサポートすることにより、簡単に、アプリケーションを調整することができます。

以下の場合には、優先順位レベルまたはローレベルのページをロックするテーブル・ロック。

* table文のほとんどは、読み取ります。
・厳格な読み取りおよび更新のキーワード、あなたが行を更新または削除することができます抽出するための単一のキーワードを読み取るために使用することができます:
SET列=値= KEY_VALUE unique_key_col WHERE tbl_name内。•UPDATE;
•WHERE unique_key_col = tbl_nameをFROM DELETE KEY_VALUE;
・SELECTが同時INSERT文と組み合わせ、そしてわずか数UPDATEまたはDELETEステートメント。
・操作BY多くのスキャンまたはGROUPには、書き込み動作は、テーブル全体ではありません。
:オプションは、行レベルまたはページレベルのロックとは異なる
多くの操作を読み取りながら、*バージョン(例えば、並行して技術を使用してMySQLに挿入する)、書き込み動作とすることができます。この次のデータ依存データベース又はテーブルは、アクセスを開始するときに依存して、異なる見解を支持します。他の一般的な用語では「時間追跡」、「書き込みコピー」または「オンデマンドのレプリケーション。」
・需要の複製は、多くの場合、レベルを行にprecedenceまたはページレベルロックを取ります。しかし、最悪の場合には、従来よりも多くのメモリを使用するようにロックすることができます。
*加えて行レベルのためにロックを、次のようなMySQLではGET_LOCK()とRELEASE_LOCK()の使用など、アプリケーションレベルのロックを使用することができます。これらは、ロックの勧告されている、彼らはよく動作するアプリケーションで作業することができます。
最高のロック速度を達成するために、InnoDBテーブルとBDBを除いて、すべてのストレージエンジンに、MySQLは(代わりに、ページ、行または列のロック)テーブルロックを使用します。明示的なLOCK TABLESを使用している場合はInnoDBとBDBテーブルでは、テーブルをロックし、MySQLは唯一のテーブルロックを使用しています。あなたがLOCK TABLESを使用しない場合はトランザクションの分離を確実にするために、InnoDBは自動行レベルロックを使用し、BDBはページレベルのロックを使用しているため。

しかし、大規模なテーブルのために、ほとんどのアプリケーションで、表には行ロックよりも優れたロックが、いくつかの欠点があります。テーブルテーブルから読み取るために多くのスレッドをロックしますが、スレッドがテーブルの上に書きたいならば、それは最初の排他的アクセスを取得する必要があります。アップデートが完了するまで、更新時には、テーブルにアクセスする他のすべてのスレッドが待機しなければなりません。

表の更新は、通常、検索テーブルよりも重要と考え、その彼らに高い優先順位を与えます。これは、その活動のテーブルは、テーブル非常に重いSELECTアクティビティにある場合でも、「餓死」することはできません更新を確認する必要があります。

ハードドライブがいっぱいになると、スレッドが処理できる前に空き領域が存在しなければならないので、この場合の表ロックは、そのようなスレッドが待機しているときなどの問題を引き起こします。この場合、テーブルへのアクセスの問題をしたいすべてのスレッドも多くのディスク領域が使用可能になるまで待機している状態で表示されるように設定されています。

テーブルロックは、次の場合に問題があります:

•クライアントは、実行時間の長いクエリを送りました。
*次に、同じテーブルの上に別の顧客が更新されます。SELECTが終了するまでクライアントが待機する必要があります。
・別のクライアントが同じテーブル上の別のSELECT文を発行します。SELECTよりUPDATE高い優先順位が、UPDATEステートメントは、SELECTの完了を待つため、1を選択し、最初のが完了するのを待ちます。

以下は、テーブルロックによって引き起こされる競争を回避または軽減するためにいくつかの方法について説明します。

・文より速く実行を選択しようとしています。あなたは、いくつかの概要(要約)テーブルが何を作成する必要があります。
•超低優先度のアップデートでmysqldを開始。これは、すべてのアップデート(修正)低い優先順位よりも文のSELECT文のテーブルを与えるだろう。最初のSELECTが終了するのを、この場合には、必要がなく、UPDATEステートメントの前に実行される最初の前の2つのSELECT文の場合には待機します。
•あなたはすべての更新特定の接続は、低優先度を使用するように指定するSET_UPDATES = 1つのステートメントを使用することができます。
•あなたは、より低い優先度を、プロパティでUPDATEを特定のINSERT LOW_PRIORITYを与える、またはステートメントを削除することができます。
•あなたはHIGH_PRIORITY特定のSELECT文の優先順位の高いプロパティを与えることができます。
・一時的に挿入特定の数の完了後にすべてのテーブルのSELECT文を待つの優先順位を上げるためにMySQLを強制的にmax_write_lock_countシステム変数としてmysqldを開始するために低い値を指定します。これはWRITEロックの特定の番号の後に与えられたREADロックすることができます。
あなたはSELECTと組み合わせたINSERTに問題がある場合、彼らは同時SELECTとINSERTをサポートしているため、新しいMyISAMテーブルを使用するように切り替えます。
あなたが挿入をミックスして、同じテーブルの上に削除した場合、INSERT DELAYEDは大きな助けになるだろう。
あなたはSELECTミックスと同じテーブルの問題に文を削除した場合、LIMITオプションが役に立つことができDELETE。
テーブルがロック時間が短い助けることができるようにSQL_BUFFER_RESULT SELECTステートメントを使用します。
•あなたはロックコードを変更することができますMYSYS / thr_lock.cは、単一のキューを使用することです。この場合は、ロックを書き込み、ロックを読みが同じ優先順位を持つことになり、いくつかのアプリケーションのために役立つだろう。

ここではMySQLのテーブルロックに関連するいくつかのヒントがあります:

・あなたが同じテーブル内の複数の行を選択し、混合をチェックし、更新する必要がない場合は、並列に実行することができます。
•あなたは、更新よりも多くの新しいが、はるかに高速ロックでロックされていないため、速度を上げるためにLOCK TABLESを使用することができます。複数のテーブルにカットテーブルの内容も参考にすることができます。
テーブルには、パフォーマンス向上のためにMySQLのInnoDBテーブルやBDBテーブルでロックされている場合・スピードの問題を経験し、あなたがテーブルに変換することができます
生命権についてあなたが混乱しましたか?梱包その後、それは長い旅を始めました

ます。http://www.cnblogs.com/daxian2012/archive/2012/09/04/mysql.htmlからBenpian転送

 

 

 

 

第三に、メカニズムは、テーブルをロック

より良い高い同時実行の下でMySQLを最適化するためには、ロック機構テーブルのMySQLのクエリの更新を見ることが必要です。

I.概要

ページレベル、テーブルレベル、行レベル:MySQLはロックの三つのレベルがあります。

BDBストレージエンジンは、ページ・ロック(ページレベルの使用;のMyISAMとMEMORYストレージエンジンは、テーブル・レベルのロック(テーブルレベルのロック)を使用して
ロック)だけでなく、テーブルのロックをサポートし、InnoDBストレージエンジンは、両方の行レベルのロックをサポート(行レベルのロッキング)、また、テーブルレベルのロックをサポートしていますが、デフォルトでは、行レベルのロックを使用することです。

MySQLは次のようにこれらの三つの特徴を大まかに要約することができるロック:

テーブルレベルロック:小さなオーバーヘッドは、高速ロック、デッドロックしない、大きなサイズ、並行性の最高と最低度のロック競合の確率をロックします。
行レベルのロッキング:大きなオーバヘッド、低速ロック、デッドロックが存在するであろう、最小サイズ、ロック競合の最も低い確率をロック、並行性の最高度を有しています。
ページロック:オーバーヘッドロックとテーブルと行ロックの間の時間境界は、一般的に粒度テーブルと行ロックの境界、同時実行をロック、デッドロックが存在することになります。

二、MyISAMテーブルロック

MyISAMストレージエンジンは、唯一のテーブルロックをサポートしています今ではほとんど使用されるストレージエンジンです。

1、照会テーブル・レベルのロック競合

システム上table_locks_waited table_locks_immediate状態変数と分析表ロックの競合をチェックすることにより:
MySQLの>「%表」のようなステータスを表示します。
+ -------- + ---- +
|変数名|価値|
+ - + ---- + ------
| Table_locks_immediate | 76939364 |
| Table_locks_waited | 305 089 |
+ -------- + ---- +
組の値2行(0.00秒) Table_locks_waited 比較的高いです、より深刻なテーブル・レベルのロック競合があることを示します。

2、MySQLのテーブルロックロックモード

MySQLのテーブルレベルのロックは、2つのモードがあります。共有テーブルがロック(表リードロック)と、テーブルの排他書き込みロック(表読み書き
ロック)。MyISAMテーブルは、クエリを(SELECT)を実行する前に、自動的に更新操作(UPDATE、DELETE、INSERT、等)を行う前に、自動的に関与するテーブル書込ロックに追加され、関係するロックを読み取るすべてのテーブルに追加されるであろう。

だから、MyISAMテーブル操作のために、次があるでしょう。

他のプロセスを遮断することなく、読み出し動作MyISAMテーブル(プラスロック読み取り)は、同じテーブルの読み出し要求が、同じテーブルへの書き込み要求をブロックします。唯一のロックが解除されて読んだ後、それは他のプロセスの書き込み操作を実行します。
B、他のプロセスの読み出しおよび書き込み動作を実行し、読み出しおよび書き込み操作を同じテーブル上の他のプロセスをブロックするロックが解除された場合にのみ書き込みます、MyISAMテーブル(書き込みロック)のために書き込みます。

一例として以下この点を確認します。200万データフィールドID、電話であるデータシートgz_phone、UA、一日。同時に複数のクライアントを分析することによって手術台つつ。

、読み出し動作のために比較的長い時間、クライアント端末2は、それぞれの読み取りおよび書き込み操作をするとき、私は、クライアントを使用します。

CLIENT1:
UAがgz_phoneグループからのmysql> SELECT COUNT(*);
セット中の75508行(3分15.87秒)CLIENT2:
gz_phone制限1000,10から選択ID、電話。
+ - + --- +
| ID | 携帯電話|
+ - + --- +
| 1001 | 2222 |
| 1002 | 2222 |
| 1003 | 2222 |
| 1004 | 2222 |
| 1005 | 2222 |
| 1006 | 2222 |
| 1007 | 2222 |
| 1008 | 2222 |
| 1009 | 2222 |
| 1010 | 2222 |
+ - +···+
組(0.01秒)に10行
のMySQL>更新gz_phoneセット電話= '11111111111'where ID = 1001。
クエリOK、0行が影響を受けた(2分57.88秒)
行が一致した:1変更:0警告:0

データテーブルは読み取りロックを持っている説明は、他のプロセスのクエリはすぐに実行されますが、読み取りロックが解除された後に行われる更新操作を待つ必要がすることができます。

読み取り操作および書き込み、それぞれ、クライアント2及び3により、長時間動作するクライアントを更新するために使用B:

CLIENT1:
MySQLの> gz_phoneセット電話= '11111111111'の更新。
クエリOK、1671823行が影響を受けた(3分4.03秒)
行が一致:2212070の変更:1671823の警告:0 CLIENT2を:
MySQLの>を選択し、ID、電話、UA、gz_phone限界10から日;
+ - + --- + ------- + ---- +
| ID | 携帯電話| UA | 日|
+ - + --- + ------- + ---- +
| 1 | 2222 | SonyEricssonK310c | 2007年12月19日|
| 2 | 2222 | SonyEricssonK750c | 2007年12月19日|
| 3 | 2222 | MAUI WAPブラウザ| 2007年12月19日|
| 4 | 2222 | Nokia3108 | 2007年12月19日|
| 5 | 2222 | LENOVO-I750 | 2007年12月19日|
| 6 | 2222 | BIRD_D636 | 2007年12月19日|
| 7 | 2222 | SonyEricssonS500c | 2007年12月19日|
| 8 | 2222 | SAMSUNG-SGH-E258 | 2007年12月19日|
| 9 | 2222 | NokiaN73-1 | 2007年12月19日|
| 10 | 2222 | Nokia2610 | 2007年12月19日|
+ - +···+ ------- + ---- +
セットにおける10行(2分58.56秒)クライアント3:
MySQLの>更新gz_phoneセット電話= '55555'where ID = 1。
クエリOK、1行が影響を受けた(3分50.16秒)
行が一致した:1変更:1つの警告:0

データテーブルが書き込みロックを持っている場合は、読み取りおよび書き込み操作は、他のプロセスを待つために必要とされる読み取りロックが解放された後に実行されます。

3、同時挿入

原則的には、データテーブルは読み取りロックを持っている、他のプロセスはこのテーブルを更新しますが、一定の条件の下で、MyISAMテーブルクエリとも行わ同時操作の挿入をサポートすることはできません。

MyISAMストレージエンジンは、具体的に同時挿入の動作を制御するために、可変concurrent_insertシステムを有し、その値は0、1または2であってもよいです。

concurrent_insertは、同時挿入を許可していない場合は、0に設定されています。
concurrent_insertが1に設定されている場合MyISAMテーブル読み込み処理を可能にしながら、Bは、(行が削除されずにテーブルの、すなわち、中央)ボイドのMyISAMテーブル場合、別のプロセスは、テーブルのレコードの端部から挿入されています。これは、MySQLのデフォルトの設定です。
Cは、2に設定されているconcurrent_insertは関係なく、MyISAMテーブルがボイドを有していない場合、テーブルのレコードの同時挿入端が可能となります。

4、MyISAMテーブルロックスケジューリング

MySQLの書き込み要求は、一般的にそこ同時読み取りがあり、要求を書くので、もし、読み取り要求よりも重要であると考えられているので、その後、MYSQLは、書き込み動作を優先させて頂きます。(特に更新されたインデックス内のフィールドの存在下で)更新操作の多くの後、このようなMyISAMテーブルは、クエリの原因になりますときに操作が閉塞クエリで、その結果、読み取りロックを得ることは困難です。

私たちは、設定の数によってスケジューリング行動のMyISAMを調整することができます。

A、ブートパラメータに低優先度の更新を指定することにより、優先権主張のように、デフォルトのMyISAMエンジンが要求を読み取るようにすることを与えられました。
B、接続更新要求が低い優先順位によって送信されたように、コマンドSET LOW_PRIORITY_UPDATES = 1を実行することによって。
Cは、INSERT、UPDATEを指定することにより、LOW_PRIORITYステートメントのプロパティをDELETEステートメントの優先順位を下げます。

3つの方法が最優先の更新、またはクエリ好ましい方法のどちらかです。ここで注意すべき、盲目的にいくつかのクエリ操作を実行するのに長い時間がかかるので、読むために優先MySQLを与えるだけでなく、書き込み処理にしないさ「餓死します。」あなただけの実際の状況に応じて、優先度の設定を実行するアクションを決定します。これらのメソッドは、同じ時間クエリで問題を解決し、根本的に更新されませんでした。

データ及び公表のmysqlの高い大量で、我々はまた、からのロードバランシングを実現するために、つまり、最適化する別の戦略を採用することができます(読み書き)mysqlのマスターで区切られ、それはとても動作の優先順位を回避することができます別の操作が目詰まりを起こすことがあります。分離技術でmysqlの書き込みスペースを説明するために使用されます

おすすめ

転載: www.cnblogs.com/xiaoL/p/11099291.html