一般にテーブルの更新は SELECT より重要だと見なされるため、
テーブルを更新するステートメントはすべて、テーブルから情報を取り出す
ステートメントより優先度が高くなります。これにより、更新では特定の
テーブルに対して大量の重いクエリが使用されるため、更新が ‘資源枯渇’
にさらされないことが確実になります(これは、更新を実行する
ステートメントを LOW_PRIORITY とともに使用するか、
SELECT ステートメントとともに HIGH_PRIORITY を使用することで変更できます)。

InnoDB テーブルと BDB テーブルの場合は、MySQL で LOCK TABLES によって
明示的テーブルをロックした場合のみテーブルロックが使用されます。
InnoDB は自動行レベルロックを使用し、BDB はページレベルロックを使用して
トランザクションの独立を確実にするため、これらのテーブル型には、
LOCK TABLES をまったく使用しないように推奨

━以下のアイテムはテーブルロックによる競合を軽減または回避する方法━

*SELECTステートメントの実行の高速化を試行する。これにはサマリテーブルの作成が必要な場合もあります。
*–low-priority-updatesのオプションで mysqldを開始する。これは、テーブルを更新(変更)するすべてのステートメントの優先度を SELECTステートメントの優先度より低くします。 この場合、前シナリオの2つ目のSELECTステートメントはUPDATEステートメントの前に実行され、一番目のSELECTが完了するまで待機する必要はありません。
*SET LOW_PRIORITY_UPDATES=1ステートメントを使用すると、特定の接続からの更新すべてが低い優先度で実行されるように指定できます。
*LOW_PRIORITY属性を使用して、特定のINSERT、UPDATE、または DELETEステートメントの優先度を低く設定できます。
*HIGH_PRIORITY性を使用すると、特定の SELECT の重要度を高く指定できます。
*max_write_lock_countシステム変数の値を低くしてmysqldを開始し、MySQLに全てのSELECTステートメント(特定数をテーブルに挿入した後に待機しているステートメント)の優先度を一時的に引き上げさせます。これは、一定数のWRITEロックの後にREADロックを設定します。
*SELECTと結合したINSERT に問題がある場合は、SELECTステートメントとINSERT ステートメントの同時サポートが可能になるため、新規の MyISAMテーブルを使用するように切り替えます。
*SELECTとDELETEステートメントに問題がある場合、DELETEにLIMITオプションを使用すると解決できる場合があります。
*SELECTステートメントでSQL_BUFFER_RESULTを使用すると、テーブルロックの持続を短縮することができます。
*単一クエリを使用するために、mysys/thr_lock.cでロックコードを変更できることもあります。この場合、writeロックとreadロックは同等の優先度をもち、いくつかのアプリケーションにとって役立つものとなります。

Server version: 5.1.30 MySQL Community Server (GPL)

Type ‘help;’ or ‘\h’ for help. Type ‘\c’ to clear the buffer.

mysql> use DB01
Database changed
mysql> show tables;
+—————-+
| Tables_in_DB01 |
+—————-+
| TABLE007 |
+—————-+
1 row in set (0.00 sec)

mysql> select HIGH_PRIORITY * from TABLE007;
+—-+————–+
| id | comment |
+—-+————–+
| 1 | testtesttest |
| 2 | testtesttest |
| 3 | testtesttest |
+—-+————–+
3 rows in set (0.00 sec)

mysql>

詳細:
http://dev.mysql.com/doc/refman/5.1/ja/table-locking.html

high_pri

Comments are closed.

Post Navigation