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.テーブルをロックするときにキーワードを付けた場合
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が良い選択です.
二.MyISAM
1.開門見山
MyISAMテーブルロックには、テーブル共有リードロック(table read lock)とテーブル独占ライトロック(table write lock)の2つのモードがあり、ロックの解釈は以下の通りである.
次のような場合に適しています.
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が大量の更新操作とクエリー操作アプリケーションを含むのに適していない理由です.
調整方法:
三.InnoDBストレージエンジン
1.開門見山
コミット、ロールバック、クラッシュ・リカバリ機能を備えたトランザクション・セキュリティ(ACID互換性)ストレージ・エンジン.
注意:ロー・ロックは、SQLの更新(update)や削除(delete)文でインデックスが使用されていない場合など、テーブル・ロックになります.そのため、InnoDBでデータを操作するときにテーブル全体をロックして取得(テーブル・ロック)する必要があります.インデックスを使用すると、InnoDBはインデックス条件のみでデータを取得し、インデックスに対応するロー(ロー・ロック)のみをロックします.
2.実例分析
問題の説明:
この問題が発生した場合、多くの場所から分析を行い、正しい解決策が得られません(説明1モジュールは私が書いたものではないので、更新テーブルのコード操作を表示しませんでした)
可能な理由:
記述1におけるタイミングタスク更新テーブルAの場合、更新条件にインデックスが使用されず、タイミングタスク更新テーブルが行われるとテーブルロックが形成される.その後、テーブルAのデータ量が大きいため、検索が遅くなり、2でのテーブルAの書き込み操作を記述する等ロックタイムアウトが発生する.
3.適用シーン
一般的に、トランザクションサポートが必要で、同時読み取り頻度が高い場合は、InnoDBが良い選択です.