4

私は本を​​読んHigh Performance MySQLでいます、それは言及しています:

performing one query per table uses table locks more efficiently: the queries 
will lock the tables invididually and relatively briefly, instead of locking 
them all for a longer time.

MyISAMはselecting何かがあったとしてもテーブルロックをかけますか?誰かが少し説明できますか?

4

2 に答える 2

11

MyISAMにはさまざまな種類のロックがあります。SELECT操作により、テーブルにREADLOCKが配置されます。アクティブな書き込みロックがない限り、いつでも複数のアクティブな読み取りロックが存在する可能性があります。テーブルを変更する操作。INSERT、、またはテーブルUPDATEWRITELOCKを配置します。書き込みロックは、アクティブな読み取りロックがない場合にのみテーブルに配置できます。アクティブな読み取りロックがある場合、MyISAMは、アクティブな読み取りロックがすべて期限切れになるとすぐにアクティブになるように書き込みロックをキューに入れます。DELETEALTER TABLE

同様に、アクティブな書き込みロックがある場合、テーブルに読み取りロックを設定しようとすると、テーブルの書き込みロックが期限切れになるまで、ロック(および関連するクエリ)がキューに入れられます。

最終的に、これはすべて次のことを意味します。

  • アクティブな読み取りロック(共有ロックとも呼ばれます)はいくつでも持つことができます
  • アクティブな書き込みロック(排他ロックとも呼ばれます)は1つだけ持つことができます

詳細については、http://dev.mysql.com/doc/refman/5.5/en/internal-locking.htmlを参照してください。

于 2011-06-20T17:46:48.957 に答える
1

reko_tは良い答えを提供しました、私はそれについて詳しく説明しようとします:

はい。

  • 1人のライターまたは複数のリーダーのいずれかを持つことができます
  • 同時挿入と呼ばれる特別な場合を除いて。これは、1つ以上のスレッドが選択(読み取り)クエリを実行している間に、1つのスレッドに挿入を実行させることができることを意味します。
    • これを行うには多くの注意事項があります。
    • テーブルの「最後」にある必要があります。中央の「穴」にはありません。
    • 同時に実行できるのは挿入のみです(更新、削除はできません)
  • 単一のMyISAMキーバッファにはまだ競合があります。サーバー全体に対して、単一のミューテックスによって保護された単一のキーバッファーがあります。インデックスを使用するものはすべて、インデックスを取得する必要があります(通常は数回)。

基本的に、MyISAMの並行性は低くなっています。あなたはそれを偽造しようとすることができます、しかしそれはあなたがそれをどのように見ても悪いです。MySQL / Oracleは最近それを改善する試みをしていません(ソースコードを見て、私は驚いていません-彼らはバグを導入するだけです)。

多くの行を取得する「大きな」SELECTが多数あるワークロードがある場合、または何らかの方法で難しい場合は、それらが重複することがよくありますが、これは問題ないように思われる場合があります。ただし、1行の更新または削除を行うと、それらの多くがブロックされます。

于 2011-06-20T21:08:07.553 に答える