mysqlデータベースエンジンInnoDBとMyISAM

4100 ワード

一.Mysqlロック分類
  • 表級ロック:オーバーヘッドが小さく、ロックブロックを追加する.デッドロックは発生せず、ロック粒度が大きく、ロック衝突が発生する確率が最も高く、同時度が最も低い.
  • 行級ロック:オーバーヘッドが大きく、ロックが遅い.デッドロックが発生します.ロック粒度は最小であり,ロック衝突が発生する確率は最低であり,同時性も最高である.
  • ページロック:テーブルロックとローロックの間にオーバーヘッドとロックが境界され、デッドロックが発生します.パーティクル境界とテーブルロックとローロックの間をロックします.通常は同時です.

  • 二.MyISAM
    1.開門見山
  • 1.MyISAMは物事をサポートしていません.
  • 2.MyISAMはテーブルロックのみをサポートします.
  • 表が破損した後にデータを回復できない.

  • MyISAMテーブルロックには、テーブル共有リードロック(table read lock)とテーブル独占ライトロック(table write lock)の2つのモードがあり、ロックの解釈は以下の通りである.
  • myISAMテーブルの読み取り操作は、同じテーブルに対する他のユーザの読み取り要求をブロックすることはありませんが、同じテーブルに対する書き込み要求をブロックします.
  • myISAMテーブルの書き込み操作は、同じテーブルに対する他のユーザーの読み取りと書き込み操作をブロックします.
  • myISAMテーブルの読み取り、書き込み操作の間、および書き込み操作の間はシリアルである.

  • 次のような場合に適しています.
  • 多くのcountの計算
  • クエリーは非常に頻繁です
  • MyISAMはクエリーを実行する前に、自動的にテーブルのロック解除、ロック解除操作を実行します.一般的には、ユーザーが手動でロック解除する必要はありませんが、ロックを表示する必要もあります.もちろんunionで関連クエリーの代わりに
    1 lock table t1 read, t2 read;  
    2 select count(t1.id) as 'total' from t1;  
    3 select count(t2.id) as 'total' from t2;  
    4 unlock tables; 

    注意事項
    1.テーブルをロックするときにキーワードを付けた場合
    local,満足
    myISAMテーブルの同時挿入の問題.eg: lock table t3 read local;
    2.locak tablesを使用してテーブルをロックする場合は、ロック後、現在のセッションでは、ロックされていないテーブルを操作できないため、関連するすべてのテーブルを同時にロックする必要があります.
    2.問題の同時挿入
    MyIAMテーブルの読み取りと書き込みはシリアルであるが、これは全体として、一定の条件下でMyISAMテーブルもクエリーと挿入操作の同時進行をサポートする.
    MyISAMストレージエンジンにはシステム変数concurrent_があります.insertは、同時挿入の動作をチャージするために特化され、その値はそれぞれ0,1および2であることができる.
    concurrent_Insert=0の場合、同時挿入は許可されません
    concurrent_Insert=1の場合、myisamテーブルに空洞がない(すなわち、テーブルの真ん中に削除されたローがない)場合、myisamは1つのプロセスがテーブルを読みながら、別のプロセスがテーブルの最後からレコードを挿入することを許可します.
    concurrent_Insert=2の場合、myisamテーブルに空洞があるかどうかにかかわらず、テーブルの最後にレコードを同時に挿入できます.
     3.MyISAMロックスケジューリングの問題
    MyISAMストレージエンジンのリード・ロックとライト・ロックは反発し、読み書き操作室がシリアルである場合、読み書きの2つのプロセスが同時に同じテーブルを要求すると、Mysqlは書き込みプロセスにロックを先に取得させる.それだけでなく、リードリクエストが先にロック待機キューに到着しても、ライトロックが到着してからライトロックが先に実行されます.mysqlは、読み取りリクエストよりも書き込みリクエストが重要だからです.これは、MyISAMが大量の更新操作とクエリー操作アプリケーションを含むのに適していない理由です.
    調整方法:
  • 起動パラメータlow-priority-updatesを指定することにより、MyISAMエンジンは、読み込み要求優先の権限
  • をデフォルトで付与する.
  • set low_を実行することによってPRIORITY_UPDATES=1で、更新要求の優先度を下げます.
  • INSERT、UPDATE、DELETE文のLOW_を指定PRIORITYプロパティ.

  • 三.InnoDBストレージエンジン
    1.開門見山
    コミット、ロールバック、クラッシュ・リカバリ機能を備えたトランザクション・セキュリティ(ACID互換性)ストレージ・エンジン.
  • サポート事物と外部キー
  • デフォルトは行ロック
  • です.
  • はデータ復旧
  • をサポートする.
    注意:ロー・ロックは、SQLの更新(update)や削除(delete)文でインデックスが使用されていない場合など、テーブル・ロックになります.そのため、InnoDBでデータを操作するときにテーブル全体をロックして取得(テーブル・ロック)する必要があります.インデックスを使用すると、InnoDBはインデックス条件のみでデータを取得し、インデックスに対応するロー(ロー・ロック)のみをロックします.
    2.実例分析
    問題の説明:
  • システムにはリアルタイムのタイミングタスクがあり、条件付きでトリガーされると、対応するAテーブルが更新されます.
  • ですが、Aテーブルへの書き込みが同時に行われているため、テストを行うと「ロックウォッチタイムアウトエクセイド」というエラーが固定されない場合があります.

  • この問題が発生した場合、多くの場所から分析を行い、正しい解決策が得られません(説明1モジュールは私が書いたものではないので、更新テーブルのコード操作を表示しませんでした)
    可能な理由:
    記述1におけるタイミングタスク更新テーブルAの場合、更新条件にインデックスが使用されず、タイミングタスク更新テーブルが行われるとテーブルロックが形成される.その後、テーブルAのデータ量が大きいため、検索が遅くなり、2でのテーブルAの書き込み操作を記述する等ロックタイムアウトが発生する.
    3.適用シーン
  • の更新とクエリーはかなり頻繁で、多重同時
  • トランザクションが要求されるか、信頼性が高い
  • 外部キー制約、MySQLが外部キーをサポートするストレージエンジンはInnoDB
  • のみ
    一般的に、トランザクションサポートが必要で、同時読み取り頻度が高い場合は、InnoDBが良い選択です.