MySQLのInnoDBエンジンとロック
MySQLのロックは非常に私たちはしばしば遭遇する高周波面接の質問、ですが、我々はどこ予告あなたの毎日の開発ではありませんでした。私は、もっと深いことのInnoDBのいくつかの基本的な概念を紹介するだけでなく、自分を記録するようになり、取引を理解するために同じ、ロックが理解するために、トランザクションの組み合わせを必要とするため、この記事では、唯一のロックの基本的な概念を説明し、この記事を通してそれを共有ロックの私自身の理解を置きます学習、交流を議論する歓迎。
次へ:トランザクションとMVCC mysqlの
ロックカテゴリー:
ポイントに応じてロックの粒度
- グローバル・ロック:ロックデータベース全体、ライブラリがある建物のアナロジー、であるが、この時に建物全体をドアロック
- 表ロック:ロック全体の層が層である場合に、特定のテーブルのロック、建物のフロアのテーブル類推、
- 行レベルロック:ロックは、データラインであり、各行類似ロックが部屋の層であり、このときロックが部屋であります
- テーブルと行ロックの差
- テーブルレベルのロックは、大きな、高速なロックをかけ、デッドロックが発生しません。大規模なロックの粒度。同時実行の程度が低いです。
- 行レベルのロック、小さなオーバーヘッドは、遅いロック、デッドロック、小ロック粒度、高い並行性が存在するであろう。
テーブル・レベルのロック。
MySQLのテーブルロック、2があります。メタデータおよびテーブルのロック。
テーブルロックの二つの形式:
表は、読み取りロックを共有しました
表の排他書き込みロック
手動でテーブルロックを追加
lock table tableName read;
ビューテーブルロックケース
show open tables;
削除するには、テーブルロック
unlock tables;
メタデータロック:
- バージョン5.5は、時間にMDL、データの追加および削除のテーブルを導入し、プラスMDLは、ロックを読んで、テーブル構造の変更に加え、MDLの書き込みロックをする時間。
行レベルのロック
INNODB用のMySQL行レベルロックストレージエンジンが実装され、MySQLは、デフォルトのデータエンジン。本稿では、InnoDBの行ロックを記述する。
InnoDBの行ロックは、インデックスエントリロックを達成することである唯一のデータ行ロックを取得するためにインデックスを使用するか、または、彼らはテーブル・ロックを使用することを意味します。
用語の範囲に応じて
- 行ロック:ログテーブルのロック1。
- ギャップをロック:
- インデックスレコード中間値をロックします
- インデックスの最後の値の後の前に最初のロック値またはインデックスレコード
機能的によると、
- また、S-ロックとして知られている共有ロックは、その他のトランザクションは排他ロックを追加防止、データの行を読み取るためにトランザクションを可能にする、共有ロックは、読み取りを追加し続けることが許可されています
- また、Xロックとして知られている排他ロック:トランザクションは、更新データに排他ロックを取得できるように、他のトランザクションを防止するには、共有ロック、書き込みアドに排他ロックを読み取る追加します
InnoDBのために、ステートメントが自動的に排他ロック、Xロックへの追加と削除に追加されます。通常のクエリのために、任意のロックを追加しません。
意図的ロック
InnoDBはまた、意図的ロックであるテーブル・レベル・ロックを実現します。意図的ロックは、内部使用をMySQLと介入するユーザーを必要としません。
- 意図共有ロック、ロックはIS:ライツは、データライン共有ロックに追加する予定、トランザクション必見の取得を使用すると、データラインに共有ロックを追加する前にテーブルをロックです。
- 意図排他ロックIXロック:トランザクションデータはエア・カナダに排他ロックを与えるために起こっている、排他ロックを追加する行のトランザクションデータは、テーブルの上にIXロック前に取得する必要があります。
行ロックと缶共存テント、役割は、パフォーマンスを向上させるために意図的ロックするときに、完全な表更新データ、または行の行ロックを持っているデータを取得するために、テーブル全体を更新するとき。
ロックギャップ
名前が示すように、主ロックは、記録の間に追加され、ギャップはデータを挿入することは許されません。例えば、IDはトランザクションがファントム読み取りの問題を解決するときに、冒頭で再び、234ロックこれら三つをロック後にも大きな役割ギャップロックを導入し、ギャップをロックするでしょうギャップを使用して、この時、24です。ここで見つけること。
デッドロック
我々のコード理論におけるMySQLのデッドロックとデッドロックが同じで、違いは、mysqlは結果としてデッドロックので、彼らが保持するリソースを解放するためにロックを解除するためにお互いを待っている二つの異なる接続を指し、です。MySQLはまた、デッドロックの最適化の権利を有します。その後、後に具体的に我々。
その後、我々は、上記のちょうどロックの基本的な概念を説明するための簡単な紹介、コンビネーションロックだけでなく、トランザクションの一部を理解する必要があるので、ロック後に存在している、トランザクションを導入し始めました。
私たちは、取引、InnoDBのアーキテクチャについてLETの話を紹介する前に、トランザクションのいくつかの部分は、このセクションの内容を含むことになります。
InnoDBのディスク・ファイル
InnoDBのディスク・ファイル
- 表スペース
- システムテーブルスペースは共有テーブルスペースです
- システムは、アンドゥシステムテーブルで作成したユーザーデータとインデックステーブル構造を含む記憶領域をログデータディクショナリテーブルスペース、doule書き込みバッファ、変更バッファを含みます
- ユーザー表スペース
- 各ユーザのinnodb_file_per_tableを設定パラメータは、ファイルの.ibdあるテーブルInnoDBエンジンに基づいて、個別のユーザー表スペースを作成することができます。
- テーブルのデータ、インデックス情報を格納します。
InnoDBのメモリ構造
- バフプールプール
- データはディスク上に格納され、差分速度CPU速度に起因するディスクは、バッファプールの使用は、全体的なパフォーマンスを向上させます。
- innodb_buffer_pool_sizeバッファプールのサイズによって提供されてもよい、パフォーマンス上のバッファプールのサイズが影響を与えるとしています。
- データバッファプールのタイプ:
- インデックスページ
- データページ
- 仕事へのストレージエンジンは、あなたがメモリにページ単位のデータディスクをロードする必要がある場合には、データ・ページとインデックス・ページは、ページ2種類の最も重要なタイプです
- アンドゥページ:MySQLのマルチバージョンのスナップショットを達成するためには、バージョンチェーンとして理解することができます。MVCCとロールバック操作はアンドゥログに関連しています。
- バッファ挿入:非クラスタ化インデックスを挿入するための改善された性能を
- アダプティブハッシュインデックス
- InnoDBストレージロック情報
- データ・ディクショナリ情報
ディスクオフメモリのデータ
ディスクオフ図のInnoDBデータは、達成するための2つの方法があります見ることができます
- ディスクからダーティページデータ
- 事前書かれたREDOログ
注文を出すには2つの方法があり、ディスクに永続化として理解することができます。ライブラリ突然のダウンタイム、データ損失の数ことを確認することです。
ディスクIOオフダーティページが生成されますと、ランダム書き込みがあり、時間のかかる長いです。頻繁なディスクIO性能の損失は非常に大きいです。そして、データのセキュリティを保証することはできません。汚れたページデータは、プレートまたはトレイのプロセスのダウンタイムを落とすのに十分な時間がない場合は、データが失われます。
別のプリ書かれたREDOログである一方、二重の安全性データのセキュリティと上記は、MySQL完全に鑑みて、ディスクへのダーティページは、ドロップされ、最初に私たちがREDOを知るために必要なすべてのディスクに永続化順序の書き込み速度、書き込みシーケンスでありますより高速なランダム書き込みよりも、それが、書かれた順序を使用しないで、なぜ友人は、ディスクからダーティ・ページを要求しますとき?
同時にオーダーの書き込み速度は、ディスクの断片化が生成されます、ディスクの断片化が大幅にディスクリソースを無駄にします。
トランザクションが汚れたページデータは必ずしも一品オフに終了しなかった場合にはやり直しファイル、ダーティページがチェックポイントのチェックポイント・メカニズムによって制御されている場所の受注をコミットする際、時間持続REDOログがディスクに書き込まれ、我々は進まないようにここにあります言っています。
データベースのダウンタイムの発生:
- ダーティページのデータがほとんどない、コミットされていないトランザクションを駆動します。これは、トランザクションは、別の視点をコミットしていない場合は、これらのデータの損失が正常であることを私たちは皆知っている、データの損失を発生させます。
- ダーティページのデータはほとんどないし、すでにデータを持っているログファイルをやり直し、それが再起動されますトランザクションが提出された、運転するときでREDOログ・ファイルからmysqlのデータ復旧。
何人かの友人は、REDOログ・ファイル・データは無限ではないことを、言うのだろうか?
ib_logfile0、私たちのディスク上にRODOログ命名されib_logfile1は、あなたが1サイクルので、完全な書き込み2,2 1の上に書かれている場合は2つのファイルが、書き込みの円形の方法を使用して、ある見ることができます。
REDOログはinnodb_push_log_at_trx_commitのInnoDBによってディスクが設定可能であり、セットに永続化
- 0の属性値は、トランザクションがコミットされると、書き込み動作時、書き込み時間のためにメインスレッドの待機をやり直ししません。
- プロパティ値1は、トランザクションがコミットされると、データが確実にするために、ディスクに書き込まれていないデータの損失という。
- プロパティの値は、トランザクションがコミットされると、図2に示すように、データがディスクに書き込まれたときに自分自身のための裁判官にファイルシステムをできるように、システムキャッシュに書き込まれます。
デフォルト値は、データのセキュリティを確保し、場合にのみ、1トランザクションの一貫性があることを確認します、一般的な推奨事項が1に設定され、1です。
つまり、このポストのためのすべてだ、とあなたは私を伝える感謝します。交換を探索するために質問をする歓迎。
次へ:MySQLのトランザクションとMVCC