停止 MYISAM 表的表锁

use*_*948 1 mysql multithreading myisam

我有一个 MYISAM 表,在该表上执行了长时间运行的 SELECT 语句。这些语句是否会导致正在读取的表上的锁?如果是这样,您如何阻止锁定发生?

根据https://dev.mysql.com/doc/refman/5.7/en/internal-locking.html

MySQL 对 MyISAM、MEMORY 和 MERGE 表使用表级锁定,一次只允许一个会话更新这些表。这种锁定级别使这些存储引擎更适合只读、多读或单用户应用程序。

这是否也意味着SELECT语句会创建锁?

小智 5

这些 [长时间运行的 SELECT] 语句是否会导致正在读取的表上的锁?

是的。MyISAM 表在读取时无法更新。如果对表进行长时间运行的读取(即 SELECT)查询,则任何 UPDATE 或 DELETE 查询都必须等到读取查询完成。

(INSERT 查询有时是一个例外。只要表结构中没有内部漏洞,就可以允许写入者在表的末尾插入一行而无需获得锁。但是,如果任何行被更新或删除,这可能会产生漏洞,这也需要 INSERT 查询来获取写锁。)

有关内部结构的更多信息,请阅读表级锁。但总而言之,如果担心并发性,您可能不应该使用 MyISAM。

  • @user2181948 InnoDB 被推荐用于 _all_ 目的而不是 MyISAM。它根本不使用表级锁定,并且在当前版本的 MySQL 中具有更好的整体性能。 (2认同)