Usman Awesòme Aslam Asked: 2014-03-28 08:56:08 +0800 CST2014-03-28 08:56:08 +0800 CST 2014-03-28 08:56:08 +0800 CST 当表被锁定时,MySQL 会排队查询吗? 772 我有一个小型制作网站,但它是 24/7 全天候直播的。当运行 Optimize、Analyze 或 Repair 命令时,MySQL 会锁定它正在处理的表。 问题 这对试图从 Perl 应用程序进行更改的用户有何影响? 排队等待时间表的查询是否被锁定然后被处理(假设应用程序没有超时)? 查询根本不起作用吗? 谢谢! /usman mysql table 1 个回答 Voted Best Answer RolandoMySQLDBA 2014-03-28T09:59:58+08:002014-03-28T09:59:58+08:00 由于 OPTIMIZE TABLE、ANALYZE TABLE 和 REPAIR TABLE 是 DDL,因此需要全表锁。 但是,如果所有数据都是 InnoDB,那么最新版本的 MySQL 对 DDL 锁稍微宽松一些。注意InnoDB 中关于 OPTIMIZE TABLE 的当前 MySQL 文档: 在 Mysql 5.6.17 之前,OPTIMIZE TABLE 不使用在线 DDL (ALGORITHM=INPLACE)。因此,当 OPTIMIZE TABLE 正在运行时,不允许对表进行并发 DML(插入、更新、删除),即表被锁定。此外,二级索引的创建效率不高,因为键是按照它们在主键中出现的顺序插入的。 从 5.6.17 开始,OPTIMIZE TABLE 对常规和分区 InnoDB 表使用在线 DDL (ALGORITHM=INPLACE)。由 OPTIMIZE TABLE 触发并由 ALTER TABLE ... FORCE 在掩护下执行的表重建现在使用在线 DDL (ALGORITHM=INPLACE) 执行,并且仅在短暂的时间间隔内锁定表,从而减少了并发 DML 操作的停机时间。 带分析表 ANALYZE TABLE 分析并存储表的键分布。在分析过程中,表被 InnoDB 和 MyISAM 的读锁锁定。此语句适用于 InnoDB、NDB 和 MyISAM 表。对于 MyISAM 表,此语句等效于使用 myisamchk --analyze。 维修表不道歉。文档没有说明读取,因此 SELECT 将被完全阻止,直到修复完成。 所有写入查询(INSERT、UPDATE、DELETE)都将排队,直到这些全表锁被释放。无论存储引擎是 InnoDB 还是 MyISAM,都是如此。 概括 读锁根据命令缓解 SELECT ANALYZE TABLE 将允许选择 OPTIMIZE TABLE 会尽量减少锁定时间 REPAIR TABLE 没有什么可以提供查询,只能等待
由于 OPTIMIZE TABLE、ANALYZE TABLE 和 REPAIR TABLE 是 DDL,因此需要全表锁。
但是,如果所有数据都是 InnoDB,那么最新版本的 MySQL 对 DDL 锁稍微宽松一些。注意InnoDB 中关于 OPTIMIZE TABLE 的当前 MySQL 文档:
带分析表
维修表不道歉。文档没有说明读取,因此 SELECT 将被完全阻止,直到修复完成。
所有写入查询(INSERT、UPDATE、DELETE)都将排队,直到这些全表锁被释放。无论存储引擎是 InnoDB 还是 MyISAM,都是如此。
概括
读锁根据命令缓解 SELECT