10bet网址
MySQL 8.0参考手册
相关的文档10bet官方网站 本手册下载
PDF (Ltr)- 41.6 mb
PDF (A4)- 41.7 mb
手册页(TGZ)- 262.5 kb
手册页(邮政编码)- 372.6 kb
信息(Gzip)- 4.0 mb
信息(邮政编码)- 4.0 mb
本手册节选

8.11.2表锁定问题

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

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

InnoDB的性能考虑

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

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

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

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

锁定性能问题的解决方案

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

  • 考虑将表切换为InnoDB存储引擎,要么使用创建表……引擎= INNODB在设置或使用期间ALTER TABLE……引擎= INNODB对于现有表。看到第15章,InnoDB存储引擎有关此存储引擎的详细信息。

  • 优化选择语句的运行速度更快,从而锁住表的时间更短。为此,您可能需要创建一些汇总表。

  • 开始mysqld——low-priority-updates.对于只使用表级锁的存储引擎(例如MyISAM内存,合并,这使得所有更新(修改)表的语句的优先级低于选择语句。在这种情况下,是第二个选择语句在前面的场景中执行更新声明,并没有等到第一次选择完成。

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

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

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

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

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

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

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

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