为 MYISAM table 停止 table 锁

Stopping table locks for MYISAM tables

我有一个 MYISAM table,在其上执行 long-运行 SELECT 语句。这些语句是否导致正在读取的 table 被锁定?如果是这样,您如何阻止锁定发生?

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

MySQL uses table-level locking for MyISAM, MEMORY, and MERGE tables, permitting only one session to update those tables at a time. This locking level makes these storage engines more suitable for read-only, read-mostly, or single-user applications.

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

Do these [long-running SELECT] statements cause locks on the tables that are being read?

是的。 MyISAM table 在读取时无法更新。如果在 table 上有一个长 运行 读取(即 SELECT)查询,任何 UPDATE 或 DELETE 查询都必须等到读取查询完成。

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

有关内部结构的更多信息,请阅读 table-level locks。但总而言之,如果并发是一个问题,你可能不应该使用 MyISAM。