对于存储引擎,例如MyISAM
在执行DML或DDL语句时实际执行表级锁,在MySQL的旧版本(5.6.5及更早版本)中,这样的语句会影响分区表,将锁施加到整个表上;也就是说,所有分区都被锁定,直到语句完成。在MySQL 5.7中,分区锁修剪在许多情况下消除了不需要的锁,以及从分区中读取或更新的大多数语句MyISAM
表导致只有受影响的分区被锁定。例如,选择
从一个分区MyISAM
表只锁定那些实际包含满足选择
声明的在哪里
条件已锁定。
对于使用存储引擎(例如InnoDB
,使用行级锁并且在分区修剪之前不实际执行(或需要执行)锁,这不是一个问题。
下面几段将讨论使用使用表级锁的存储引擎对表上的各种MySQL语句进行分区锁修剪的影响。
对DML语句的影响
选择
语句(包括那些包含联合或连接的语句)只锁定那些实际需要读取的分区。这也适用于选择……分区
.
一个更新
只对没有更新分区列的表修剪锁。
取代
而且插入
只锁定那些有要插入或替换行的分区。然而,如果AUTO_INCREMENT
值,然后锁定所有分区。
插入……关于重复密钥更新
只要没有更新分区列,就会被修剪。
插入……选择
只锁定源表中需要读取的分区,而锁定目标表中的所有分区。
由加载数据
不能删除分区表上的语句。
存在之前插入
或在更新之前
使用分区表的任何分区列的触发器意味着锁定插入
而且更新
更新该表的语句不能被修剪,因为触发器可以改变它的值之前插入
在表的任何分区列上的触发器意味着所设置的锁插入
或取代
不能修剪,因为之前插入
触发器可能会在插入行之前更改行的分区列,迫使该行进入不同的分区。一个在更新之前
在分区列上的触发器意味着由更新
或插入……关于重复密钥更新
不能修剪。
受影响的DDL语句
创建视图
不会导致任何锁。
修改表…交换分区
李子锁;只有交换的表和交换的分区被锁定。
修改表…截断分区
李子锁;只有要清空的分区是锁着的。
此外,ALTER TABLE
语句在表级别上接受元数据锁。
其他语句
锁表
无法修剪分区锁。
调用stored_procedure (
支持锁修剪,但支持求值expr
)expr
没有。