MySQL 5.6.5 以前では、DML または DDL ステートメントを実行するときにテーブルレベルロックを実際に実行する MyISAM
などのストレージエンジンの場合、パーティション化されたテーブルに影響するそのようなステートメントがテーブルに全体としてロックを適用していました。つまり、ステートメントが完了するまですべてのパーティションがロックされました。MySQL 5.6.6 はパーティションロックプルーニングを実装し、これによって多くの場合に不必要なロックが排除されます。MySQL 5.6.6 以降では、パーティション化された MyISAM
テーブルに対して読み取りまたは更新を行うほとんどのステートメントで、影響を受けるパーティションのみがロックされます。たとえば、MySQL 5.6.6 より前は、パーティション化 MyISAM
テーブルからの SELECT
でテーブル全体がロックされました。MySQL 5.6.6 以降は、SELECT
ステートメントの WHERE
条件を満たす行を実際に含むパーティションのみがロックされます。これには、パーティション化された MyISAM
テーブルに対する同時操作の速度および効率を向上させる効果があります。この改善は、多く (32 以上) のパーティションを持つ MyISAM
テーブルを操作するときに特に顕著になります。
この動作の変更は、行レベルロックを使用し、パーティションプルーニングの前にロックを実際に実行しない (または実行する必要がない)、InnoDB
などのストレージエンジンを使用するパーティション化されたテーブルに影響するステートメントには影響しません。
次のいくつかの段落では、テーブルレベルロックを使用するストレージエンジンを使用するテーブルに対する、さまざまな MySQL ステートメントへのパーティションロックプルーニングの影響について説明します。
DML ステートメントへの影響
SELECT
ステートメント (union または join を含むものを含む) が、実際に読み取る必要があるパーティションのみをロックするようになります。これは SELECT ... PARTITION
にも適用されます。
UPDATE
は、パーティショニングカラムが更新されないテーブルにのみロックをプルーニングします。
REPLACE
および INSERT
は、挿入または交換される行を持つパーティションのみをロックするようになります。ただし、AUTO_INCREMENT
値がパーティショニングカラム用に生成される場合は、すべてのパーティションがロックされます。
INSERT ... ON DUPLICATE KEY UPDATE
は、パーティショニングカラムが更新されないかぎりプルーニングされます。
INSERT ... SELECT
は、読み取る必要があるソーステーブル内のパーティションのみをロックするようになります (ターゲットテーブル内のすべてのパーティションはロックされます)。
INSERT DELAYED
はパーティション化されたテーブルではサポートされません。
LOAD DATA
ステートメントによってパーティション化されたテーブルに適用されるロックはプルーニングできません。
パーティション化されたテーブルのパーティショニングカラムを使用する BEFORE INSERT
または BEFORE UPDATE
トリガーが存在する場合は、このテーブルを更新する INSERT
および UPDATE
ステートメントでのロックをプルーニングできないことを意味します (トリガーがその値を変更する可能性があるため)。テーブルのパーティショニングカラムに対する BEFORE INSERT
トリガーが存在する場合は、INSERT
または REPLACE
によって設定されるロックをプルーニングできないことを意味します (BEFORE INSERT
トリガーが、行が挿入される前に行のパーティショニングカラムを変更し、それによって行が本来のものとは異なるパーティションに強制的に挿入される可能性があるため)。パーティショニングカラムでの BEFORE UPDATE
トリガーは、UPDATE
または INSERT ... ON DUPLICATE KEY UPDATE
によって適用されるロックをプルーニングできないことを意味します。
影響を受ける DDL ステートメント
CREATE VIEW
でロックが行われなくなります。
ALTER TABLE ... EXCHANGE PARTITION
がロックをプルーニングするようになります。交換されるテーブルおよび交換されるパーティションのみがロックされます。
ALTER TABLE ... TRUNCATE PARTITION
がロックがプルーニングするようになります。空にされるパーティションのみがロックされます。
ALTER TABLE
ステートメントは引き続きテーブルレベルでメタデータロックを行います。
その他のステートメント
LOCK TABLES
はパーティションロックをプルーニングできません。
CALL stored_procedure(
はロックプルーニングをサポートしますが、expr
)expr
を評価する際はしません。
DO
および SET
ステートメントはパーティショニングロックプルーニングをサポートしません。