我有一个非常慢的查询,我需要不时在MySQL数据库上运行.
我发现在查询完成之前,会阻止尝试更新正在查询的表.
我想这是有道理的,否则查询的结果可能会不一致,但它对我来说并不理想,因为查询的重要性远低于更新.
所以我的问题实际上有两个部分:
出于好奇,MySQL在这种情况下究竟做了什么?它是否在查询期间锁定表格?或者在更新之前尝试锁定它?
有没有办法让慢查询不阻塞?我猜选项可能是:
需要更新时终止查询.
在更新发生之前,对表的副本运行查询
只是让查询出错.
有没有人对此有任何想法?
听起来您正在使用MyISAM表,它使用表级锁定.在这种情况下,SELECT将在表上设置共享锁.然后UPDATE将尝试请求独占锁定和阻塞,并等待SELECT完成.完成后,UPDATE将正常运行.
MyISAM锁定
如果您切换到InnoDB,那么您的SELECT默认情况下不会设置锁定.没有必要像其他人推荐的那样更改事务隔离级别(InnoDB默认可重复读取,并且不会为SELECT设置锁定).UPDATE将能够同时运行.InnoDB使用的多版本与Oracle处理这种情况的方式非常相似.SELECTs设置锁定的唯一时间是,如果您在可序列化的事务隔离级别中运行,则查询具有FOR UPDATE/LOCK IN SHARE MODE选项,或者它是某种写入语句的一部分(例如INSERT. ..SELECT)并且您正在使用基于语句的二进制日志记录.
InnoDB锁定