2

したがって、PDO / PHP / MySQLのパフォーマンス:パフォーマンスの問題に関するトランザクションと直接実行を読んだ後、MySQLでテーブルをロックする方法について調査したいと考えていました。

http://dev.mysql.com/doc/refman/5.0/en/table-locking.html _

テーブルロックを使用すると、多くのセッションが同時にテーブルから読み取ることができますが、セッションがテーブルに書き込みを行う場合は、最初に排他的アクセスを取得する必要があります。更新中、この特定のテーブルにアクセスする他のすべてのセッションは、更新が完了するまで待機する必要があります。

この部分は、私たちのクエリのほとんどが挿入ではなく更新であるため、特に私を驚かせました。すべての更新/挿入が実行されるfooというテーブルを作成してから、すべての選択が行われるfoo_view(fooのコピー、またはfooと他のいくつかのテーブルとfooのリンク)というビューを作成したのではないかと思いました。このロックの問題は引き続き発生しますか?

つまり、foo_viewのSELECTクエリは、fooで更新が完了するまで待機する必要がありますか?

同僚が尋ねたもう1つの簡単な質問。これはキャッシングに影響しますか?つまり、SELECTがキャッシュされている場合、SELECTはキャッシュにヒットして結果を返しますか、それともロックが最初に終了するのを待ちますか?

4

1 に答える 1

3

ビューでは、基になるテーブルと同じロックが発生します。

ロックに関するMySQLリファレンスページから:

MySQL は、次のようにテーブル書き込みロックを付与します。

  1. テーブルにロックがない場合は、書き込みロックを設定します。
  2. それ以外の場合は、ロック要求を書き込みロック キューに入れます。

MySQL は、次のようにテーブル読み取りロックを付与します。

  1. テーブルに書き込みロックがない場合は、読み取りロックを設定します。
  2. それ以外の場合は、ロック要求を読み取りロック キューに入れます。

これは、使用しているデータベース エンジンに依存することに注意してください。 MyISAMは上記の手順に従い、代わりにInnoDBのようなエンジンが行レベルのロックを行う テーブル全体を (複数のパーティションに分割されている場合でも)ロックします。

MyISAM で必要なパフォーマンス ベンチマークに達しておらず、ボトルネックが更新によるテーブル ロックを待っていることがわかっている場合は、テーブルのストレージ エンジンを InnoDB に変更することをお勧めします。

于 2010-06-09T18:38:28.387 に答える