即使在处理'select'查询时,myisam也会将表锁定在表上?

时间:2011-06-20 17:40:55

标签: mysql myisam table-lock

我正在阅读这本书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.

即使selecting某事,MyISAM也会锁定表格?有人可以解释一下吗?

2 个答案:

答案 0 :(得分:11)

MyISAM有不同类型的锁。 SELECT操作会在表格上放置 READ LOCK 。只要没有活动的 WRITE LOCKS ,任何给定时间都可以有多个活动读锁。修改表格的操作,例如INSERTUPDATEDELETEALTER TABLE在表格中放置 WRITE LOCK 。只有没有活动的读锁时,才能将写锁定放在表中;如果存在活动的读锁定,则只要所有活动的读锁定都到期,MyISAM就会将写锁定队列激活。

同样,当存在活动的写锁定时,尝试在表上放置读锁定将对锁(以及关联的查询)进行排队,直到表上的写锁已过期。

最终这一切意味着:

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

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

答案 1 :(得分:1)

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

  • 你可以拥有一位作家或几位读者
  • 除了有一个特殊情况,称为concurrent inserts。这意味着您可以让一个线程执行插入操作,而一个或多个线程执行select(读取)查询。
    • 有很多警告这样做:
    • 它必须在桌子的“尽头” - 而不是在中间的“洞”
    • 只能同时进行插入(无更新,删除)
  • 单个MyISAM密钥缓冲区仍然存在争用。对于整个服务器,有一个由单个互斥锁保护的密钥缓冲区。使用索引的所有东西都需要它(通常是几次)。

基本上,MyISAM的并发性很差。你可以尝试伪造它,但无论你怎么看待它都很糟糕。 MySQL / Oracle最近没有尝试改进它(查看源代码,我并不感到惊讶 - 他们只会引入错误)。

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