我正在阅读这本书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也会锁定表格?有人可以解释一下吗?
答案 0 :(得分: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
答案 1 :(得分:1)
reko_t提供了一个很好的答案,我将尽力详细说明:
是
基本上,MyISAM的并发性很差。你可以尝试伪造它,但无论你怎么看待它都很糟糕。 MySQL / Oracle最近没有尝试改进它(查看源代码,我并不感到惊讶 - 他们只会引入错误)。
如果你的工作负载有很多“大”的SELECT来检索很多行,或者在某些方面很难,它们可能经常重叠,这看起来似乎没问题。但是单行更新或删除会阻止它们的全部。