10bet网址
MySQL 5.7参考手册
相关的文档10bet官方网站 本手册下载
PDF (Ltr)- 36.3 mb
PDF (A4)- 36.3 mb
手册页(TGZ)- 235.4 kb
手册页(邮政编码)- 347.1 kb
信息(Gzip)- 3.3 mb
信息(邮政编码)- 3.3 mb
本手册节选

8.11.2表锁定问题

InnoDB表使用行级锁定,以便多个会话和应用程序可以同时对同一个表进行读写,而不会使彼此等待或产生不一致的结果。对于该存储引擎,请避免使用锁表语句,因为它不提供任何额外的保护,而是减少并发性。自动行级锁定使这些表适用于包含最重要数据的最繁忙的数据库,同时也简化了应用程序逻辑,因为您不需要锁定和解锁表。因此,InnoDB存储引擎是MySQL的默认设置。

MySQL对所有存储引擎使用表锁定(而不是页、行或列锁定)InnoDB.锁定操作本身没有太多开销。但是,由于在任何时候只有一个会话可以写入一个表,为了使用这些其他存储引擎获得最佳性能,请将它们主要用于经常查询、很少插入或更新的表。

性能考虑因素倾向于InnoDB

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

  • 表锁定允许多个会话同时从表中读取数据,但是如果一个会话想要写入一个表,它必须首先获得独占访问权,这意味着它可能必须等待其他会话先完成对表的访问。在更新期间,所有其他想要访问这个特定表的会话都必须等待,直到更新完成。

  • 当会话正在等待时,表锁定会导致问题,因为磁盘已满,需要在会话继续之前获得可用的空闲空间。在这种情况下,希望访问问题表的所有会话也被置于等待状态,直到有更多的磁盘空间可用。

  • 一个选择语句的运行时间较长,会阻止其他会话在此期间更新表,从而使其他会话显得较慢或无响应。当一个会话等待获得对表的独占访问以进行更新时,其他会话就会出现问题选择语句在它后面排队,即使是只读会话也会减少并发性。

锁定性能问题的解决方法

以下项目描述了一些避免或减少表锁定导致的争用的方法:

  • 考虑将表切换到InnoDB存储引擎,要么使用创建表……引擎= INNODB在安装或使用过程中ALTER TABLE……引擎= INNODB对于已存在的表。看到第14章,InnoDB存储引擎有关此存储引擎的详细信息。

  • 优化选择语句以更快地运行,以便它们锁定表的时间更短。为此,您可能需要创建一些汇总表。

  • 开始mysqld——low-priority-updates.对于只使用表级锁的存储引擎(例如MyISAM内存,合并),这会使所有更新(修改)表的语句优先级低于选择语句。在这种情况下,是第二个选择语句将在更新声明,而不会等待第一个选择完成。

  • 若要指定在特定连接中发出的所有更新都应以低优先级完成,请设置low_priority_updates服务器系统变量等于1。

  • 给出一个具体的插入更新,或删除语句优先级较低时,使用LOW_PRIORITY属性。

  • 给出一个具体的选择语句优先级更高时,使用HIGH_PRIORITY属性。看到第13.2.9节,“SELECT语句”

  • 开始mysqld的较低值max_write_lock_count系统变量强制MySQL临时提高优先级的所有选择在对表执行特定数量的写锁之后等待表的语句(例如,用于插入操作)。这允许在一定数量的写锁之后使用读锁。

  • 如果你有混合的问题选择而且删除语句,限制选项删除也许会有帮助。看到第13.2.2节,“DELETE语句”

  • 使用SQL_BUFFER_RESULT选择语句可以帮助缩短表锁的持续时间。看到第13.2.9节,“SELECT语句”

  • 将表内容拆分到单独的表中可能会有所帮助,因为它允许对一个表中的列运行查询,而更新仅限于不同表中的列。

  • 您可以更改锁定代码mysys / thr_lock.c使用单个队列。在这种情况下,写锁和读锁具有相同的优先级,这可能对某些应用程序有帮助。