4

我正在读这本书High Performance MySQL,它提到:

performing one query per table uses table locks more efficiently: the queries 
will lock the tables invididually and relatively briefly, instead of locking 
them all for a longer time.

MyISAM 会在selecting什么情况下放置表锁?有人可以解释一下吗?

4

2 回答 2

11

MyISAM 有不同种类的锁。一个SELECT操作在表上放置一个READ LOCK。只要没有活动的WRITE LOCKS ,在任何给定时间都可以有多个活动的读锁。修改表的操作,例如。INSERT, UPDATE,DELETE或在表上ALTER TABLE放置一个WRITE LOCK。写锁只能在没有活动读锁的情况下放在表上;如果有活动的读锁,MyISAM 会将写锁排队等待所有活动的读锁过期后立即激活。

同样,当存在活动的写锁时,尝试在表上放置读锁将使锁(和相关联的查询)排队,直到表上的写锁过期。

归根结底,这一切都意味着:

  • 您可以拥有任意数量的活动读锁(也称为共享锁)
  • 您只能拥有一个活动写锁(也称为排他锁)

有关更多信息,请参阅:http ://dev.mysql.com/doc/refman/5.5/en/internal-locking.html

于 2011-06-20T17:46:48.957 回答
1

reko_t 提供了一个很好的答案,我将尝试详细说明:

是的。

  • 你可以有一个作家或几个读者
  • 除了有一种特殊情况,称为并发插入。这意味着您可以让一个线程执行插入操作,而一个或多个线程执行选择(读取)查询。
    • 这样做有很多注意事项:
    • 它必须在桌子的“末端” - 而不是在中间的“洞”中
    • 只能同时进行插入(不能更新、删除)
  • 单个 MyISAM 密钥缓冲区仍然存在争用。整个服务器都有一个由单个互斥锁保护的密钥缓冲区。使用索引的所有内容都需要使用它(通常是几次)。

本质上,MyISAM 的并发性很差。您可以尝试伪造它,但无论您如何看待它都是不好的。MySQL / Oracle 最近没有尝试改进它(查看源代码,我并不感到惊讶——它们只会引入错误)。

如果你的工作负载有很多“大”的 SELECT 检索很多行,或者在某种程度上很难,它们可能经常重叠,这似乎没问题。但是单行更新或删除会阻止所有这些。

于 2011-06-20T21:08:07.553 回答