10bet网址
MySQL 5.6リファレンスマニュアル
本手册下载
PDF (Ltr)- 26.8 mb
PDF (A4)- 26.8 mb


8.10.2テーブルロックの問題

InnoDBテーブルでは,複数のセッションとアプリケーションが互いに待機したり,不整合の結果を生成したりすることなく,同じテーブルに対して同時に読み取りや書き込みを実行できるように,行レベルロックを使用します。このストレージエンジンでは,锁表ステートメントは特別な保護を提供せず,代わりに並列性が低くなるため,この使用を避けてください。自動の行レベルロックにより,これらのテーブルがもっとも重要なデータを格納するもっともビジーなデータベースに適合し,同時にテーブルのロックやロック解除が必要ないためアプリケーションロジックが簡単になります。その結果,InnoDBストレージエンジンはMySQL 5.6のデフォルトです。

MySQLはInnoDBを除く,すべてのストレージエンジンに対して,テーブルロック(ページ,行,またはカラムロックの代わりに)を使用します。ロック操作自体には,あまりオーバーヘッドがありません。ただし,一度に1つのセッションしかテーブルに書き込むことができないため,これらのほかのストレージエンジンでの最高のパフォーマンスのため,頻繁にクエリーされ,めったに挿入または更新されないテーブルに対して主にそれらを使用します。

InnoDBを優先するパフォーマンスの考慮事項

テーブルを作成するために,InnoDBを使用するか,別のストレージエンジンを使用するかを選択する場合,テーブルロックの次の短所を考慮してください。

  • テーブルロックにより,多くのセッションを同時にテーブルから読み取ることができますが,セッションでテーブルに書き込む必要がある場合,まず排他的アクセスを取得する必要がありますが,これはまずほかのセッションがテーブルを処理し終わるのを待つ必要がある可能性があることを意味します。更新中,この特定のテーブルにアクセスしようとするほかのすべてのセッションは,更新が完了するまで待機する必要があります。

  • ディスクがいっぱいで,セッションを続行するには空き領域が使用できるようになる必要があるため,セッションが待機している場合にテーブルロックによって問題が発生します。この場合,問題のテーブルにアクセスしようとするすべてのセッションが,より多くのディスク領域が使用できるようになるまで待機状態になります。

  • 実行に長時間かかる选择ステートメントにより,その間ほかのセッションのテーブルの更新が妨げられ,ほかのセッションが遅くなり,応答していないように見えます。セッションが更新のためにテーブルへの排他アクセスを取得するのを待機している間,选择ステートメントを発行するほかのセッションはそのあとに列をなし,読み取りセッションでも並列性が低くなります。

ロックパフォーマンスの問題の回避

次の項目では,テーブルロックによって発生する競合を回避または軽減するいくつかの方法について説明します。

  • セットアップ時に创建表……引擎= INNODBを使用するか,既存のテーブルに対してALTER TABLE……引擎= INNODBを使用して,テーブルをInnoDBストレージエンジンに切り替えることを考慮します。このストレージエンジンの詳細については,第14章「InnoDBストレージエンジンを参照してください。

  • テーブルをロックする時間が短くなるように,选择ステートメントを最適化して,実行を高速化します。これを実行するには,いくつかのサマリーテーブルを作成する必要がある場合があります。

  • ——low-priority-updatesmysqldを起動します。テーブルレベルロックのみを使用するストレージエンジン(MyISAM内存,および合并など)の場合,これにより,テーブルを更新(変更)するすべてのステートメントに选择ステートメントより低い優先度を与えます。この場合,先述のシナリオの2つめの选择ステートメントは更新ステートメントの前に実行され,最初の选择の終了を待機しません。

  • 特定の接続で発行されたすべての更新を低い優先度で実行させるように指定するには,low_priority_updatesサーバーシステム変数を1に等しく設定します。

  • 特定の插入更新,または删除ステートメントに低い優先度を与えるには,LOW_PRIORITY属性を使用します。

  • 特定の选择ステートメントに高い優先度を与えるには,HIGH_PRIORITY属性を使用します。セクション13.2.9”选择構文”を参照してください。

  • max_write_lock_countシステム変数の値を低くしてmysqldを開始し,テーブルに対する特定の数の挿入が行われたあとにテーブルを待機しているすべての选择ステートメントの優先度を一時的に強制的に高めます。これにより,特定の数のロックのあとのロックが許可されます。

  • 选择と組み合わせた插入に問題がある場合は,同時选择ステートメントと插入ステートメントをサポートするMyISAMテーブルに切り替えることを考慮します。(セクション8.10.3”同時挿入”を参照してください)。

  • 同じ非トランザクションテーブルに対して挿入と削除を組み合わせる場合,插入延迟が役立つことがあります。セクション13.2.5.2”插入延迟構文”を参照してください。

    注記

    MySQL 5.6.6現在,插入延迟は非推奨であり,将来のリリースで削除されます。代わりに插入延迟を付けない)を使用してください。

  • 組み合わされた选择删除ステートメントに問題がある場合,删除への限制オプションが役立つことがあります。セクション13.2.2“删除構文”を参照してください。

  • 选择ステートメントでSQL_BUFFER_RESULTを使用すると,テーブルロックの時間の短縮に役立つことがあります。セクション13.2.9”选择構文”を参照してください。

  • テーブルの内容を個別のテーブルに分割すると(クエリーを1つのテーブルのカラムに対して実行し,更新を別のテーブルのカラムに制限することによって),役立つことがあります。

  • 単一のキューを使用するように,mysys / thr_lock.cのロックコードを変更できます。この場合,書き込みロックと読み取りロックは同じ優先度を持ち,一部のアプリケーションに役立つことがあります。


本手册下载
PDF (Ltr)- 26.8 mb
PDF (A4)- 26.8 mb