mysql(5.6)分区(四)分区和锁定

在MySQL 5.6.5及更早版本中,对于MyISAM执行DML或DDL语句时,实际执行表级锁的存储引擎 ,影响分区表的这种语句对整个表格施加了锁定; 也就是说,所有分区都被锁定,直到语句完成。MySQL 5.6.6实现分区锁定修剪,这在许多情况下消除了不必要的锁定。在MySQL 5.6.6及更高版本中,从分区MyISAM读取或更新的大多数语句只会导致受影响的分区被锁定。例如,在MySQL 5.6.6之前,一个SELECT从分区MyISAM表导致整个表上的锁定; 在MySQL 5.6.6及更高版本中, SELECT只有实际包含满足语句 WHERE条件的行的那些分区才被锁定。这具有提高并行操作对分区MyISAM的速度和效率的作用当使用MyISAM具有多个(32个或更多)分区的表时,这种改进变得尤其明显 

这种行为变化对使用存储引擎(例如InnoDB采用行级锁定)影响分区表的语句没有任何影响, 并且在分区修剪之前并不实际执行(或需要执行)锁定。

接下来的几段讨论使用采用表级锁的存储引擎对分区锁定修剪对各种MySQL语句的影响。

对DML语句的影响

SELECT语句(包括含有联合或连接的语句)现在只锁定那些实际需要读取的分区。这也适用于 SELECT ... PARTITION

一个UPDATE只为表梅干锁上没有分区列被更新。

REPLACE和 INSERT现在仅锁定那些具有要被插入或替换的行分区。但是,如果AUTO_INCREMENT为任何分区列生成值,则所有分区都将被锁定。

INSERT ... ON DUPLICATE KEY UPDATE 只要没有分区列被更新就被修剪。

INSERT ... SELECT 现在只锁定需要读取的源表中的那些分区,尽管目标表中的所有分区都被锁定。

注意

INSERT DELAYED 不支持分区表。

LOAD DATA对分区表上 的语句强加的锁不能被修剪。

使用分区表的任何分区列 的存在BEFORE INSERT或 BEFORE UPDATE触发器意味着锁定 INSERTUPDATE更新此表的语句不能被修剪,因为触发器可以更改其值: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 语句不支持分区锁定修剪。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值