8.11.2 Table Locking Issues 表锁执行

8.11.2 Table Locking Issues 表锁执行

InnoDB 表使用行级锁,多个会话和应用可以读和写相同的表,不让对方等待或者产生一个不一致的结果。

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

但是降低并发。自动的行锁让这些表适合你最繁忙的数据库,同时也简化了应用程序的逻辑,因为你不需要lock和unlock

表。因此,InnoDB存储引擎是MySQL 5.6的默认.

MySQL 使用表锁(而不是page, row, or column locking) 对于所有的存储引擎除了InnoDB,

lock 操作本身没有太大的开销,但是因为只有一个会话可以写表在同一时间.

性能考虑支持InnoDB

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

表锁定 让很多的会话在同一时间读取一个表,但是一个会话需要写一个表,

它必须得到一个独占访问,意味着 你可能需要等待其他会话先完成表

在更新期间, 其他的会话需要访问特定的表必须等待更新完成

表锁定 导致当一个会话等待因为磁盘满了没有可用空间在会话可以处理前,所有的会话需要访问有问题的表

直到有更多的空间。

一个SELECT 语句需要很长时间运行防止其他会话 更新表,让其他会话变的很慢或者反应迟钝。

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

降低并发即使是只读会话。

锁定性能问题的解决方法

下面的内容描述一些方法来避免或者降低并发导致的问题:

1.考虑切换表到InnoDB存储引擎, 或者使用CREAE TABLE .. ENGINE=INNODB during setup, 或者使用

ALTER TABLE … ENGINE=INNODB for an existing table. See Chapter 14, The InnoDB Storage Engine for more details

about this storage engine.

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

3.启动mysqld with –low-priority-updates. 对于存储引擎只使用 table-level locking (such as MyISAM, MEMORY, and

MERGE),

给所有的语句,update 一个表 很低的优先级相比SELECT 语句。

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