8.11.2 Table Locking Issues 表锁发生

8.11.2 Table Locking Issues 表锁发生

innoDB 表使用 行级锁, 因此多个会话和应用能同时读写同样的表,

不需要相互等待或者产生不一致的结果。

对于这类存储引擎, 避免使用LOCK TABLES 语句,因为它不提供额外的保护,

但是降低了并发。 自动的row-level lock 让这些表适合你最繁忙的数据库,

同时也简化了应用的逻辑, 你不需要lock和unlock 表,因此,

InnoDB 存储引擎在Mysql 5.6中是默认的。

MySQL 使用表锁(而不是页,或者列 锁定) 对于所有的存储引擎除了InnoDB.

locking 操作它们不需要有太多的开销, 因为只有一个会话可以在同一时间对表进行写操作,

对于最好的性能相比其他的存储引擎,使用它们是查询,极少的插入和更新。

Performance Considerations Favoring InnoDB 性能考虑支持InnoDB

当选择是否要创建表使用InnoDB,或者一个不同的存储引擎, 请记住以下缺点对于表锁定:

Table 锁定 可以让很多的SESSION同一时间读取表,但是如果你一个SESSION 需要去写表,

它首选需要得到独占访问,意味着它需要等待其他会话来完成对表的操作。

在更新期间,所有的SESSION 需要访问特定表的 必须等到更新结束。

table locking 导致的问题是 当一个会话在等待因为磁盘是full 和需要空闲的空间

来变的avaliable 在session能处理前,在这种情况下,所有的sessions 需要访问这个问题表。

表级锁在更新期间,所有的其他会话需要访问这个特定表必须等待更新完成。

During the update, all other sessions that want to access this particular table must wait until the update is done

一个SELECT 语句花费很长的时间来运行防止其他会话来更新表,让其他session 变的慢或者迟钝。

当一个会话等待获取独占的访问表来更新,其他会话执行SELECT 语句会排在它后面,

降低并发。

锁定性能问题的解决方法:

下面的内容描述了一些方法来避免或减少有表锁定引发的争用:

考虑转换表为InnoDB 存储引擎,使用CREATE TABLE ENGINE=INNODB,

或者使用ALTER TABLE … ENGINE=INNODB 对于一个存在的表。

优化SELECT 语句来运行的更快,因此它们锁定表很短的时间,你可能需要创建一些汇总表来做这个:

启动MySQL 使用 –low-priority-updates,对于存储引擎使用table-level locking(比如MyISAM, MEMORY, and MERGE)

给所有的UPDATE(modify)表的语句低的优先级相比SELECT语句。

原文地址:https://www.cnblogs.com/hzcya1995/p/13351399.html