mysql select content(たとえば、countではなく)クエリは、常に少なくともmyisamテーブルのテーブル読み取りロックとinnodbテーブルの行読み取りロックを取得するようです。ロックを取得せずに、mysqlでコンテンツ選択クエリを発行する方法はありますか(必要に応じてテーブルタイプを変更できます)?検索インデックスに使用するので、返されるデータに一貫性がなくてもかまいません。
2 に答える
InnoDBでは、トランザクション分離レベルを次のように設定することでこれを実現しますREAD UNCOMMITTED
。
この分離レベルでは:
SELECTステートメントは非ロック方式で実行されますが、以前のバージョンの行が使用される可能性があります。したがって、この分離レベルを使用すると、このような読み取りには一貫性がありません。これは「ダーティリード」とも呼ばれます。それ以外の場合、この分離レベルはREADCOMMITTEDのように機能します。
MySQLオプションファイルからデフォルトのトランザクション分離レベルを変更するか、単一のセッションで有効または無効にすることができます。
SET SESSION TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;
SELECT * FROM table_name;
SET SESSION TRANSACTION ISOLATION LEVEL REPEATABLE READ;
LOCK TABLESがない場合、myisamはコミットされていないモードの読み取りと同等である必要がありますが、実際にはトランザクションタイプをサポートしていません...
innodbは、デフォルトで「一貫性のある読み取り」モード(「繰り返し可能な読み取り」分離レベル)で実行されます。これは、ドキュメントがロックしないことを示唆しています。
トランザクション分離レベルがREPEATABLEREAD(デフォルトレベル)の場合、同じトランザクション内のすべての一貫した読み取りは、そのトランザクションで最初にそのような読み取りによって確立されたスナップショットを読み取ります
..。
一貫性のある読み取りは、InnoDBがREADCOMMITTEDおよびREPEATABLEREAD分離レベルでSELECTステートメントを処理するデフォルトのモードです。一貫性のある読み取りでは、アクセスするテーブルにロックが設定されないため、他のセッションでは、テーブルで一貫性のある読み取りが実行されると同時に、これらのテーブルを自由に変更できます。
..。
InnoDBは、INSERT INTO ... SELECT、UPDATE ...(SELECT)、CREATE TABLE ... SELECTなどのselectin句に一貫した読み取りを使用します。これらの句は、innodb_locks_unsafe_for_binlogオプションが設定されている場合、FORUPDATEまたはLOCKINSHAREMODEを指定しません。トランザクションの分離レベルがSERIALIZABLEに設定されていません。したがって、選択したテーブルから読み取られた行にはロックが設定されません。
http://dev.mysql.com/doc/refman/5.0/en/innodb-consistent-read.html