2

因此,在阅读了 PDO / PHP / MySQL 中的性能:关于性能问题的事务与直接执行之后,我正在考虑我对 MySQL 中的锁定表进行了一些研究。

http://dev.mysql.com/doc/refman/5.0/en/table-locking.html

表锁定使许多会话可以同时从一个表中读取,但是如果一个会话想要写入一个表,它必须首先获得独占访问。在更新期间,想要访问此特定表的所有其他会话必须等到更新完成。

这部分让我印象特别深刻,因为我们的大多数查询都是更新而不是插入。我想知道是否有人创建了一个名为 foo 的表,在该表上执行了所有更新/插入,然后创建了一个名为 foo_view 的视图(foo 的副本,或者可能是 foo 和其他几个表加上 foo 的链接),所有选择都发生在该表上,这个锁定问题还会发生吗?

也就是说,对 foo_view 的 SELECT 查询是否仍需要等待对 foo 的更新完成?

我的同事又问了一个简短的问题。这会影响缓存吗?即,如果 SELECT 被缓存,它会命中缓存并返回结果,还是会等待锁先完成?

4

1 回答 1

3

您的视图将经历与基础表相同的锁定。

从 MySQL 参考页面上锁定

MySQL 授予表写锁如下:

  1. 如果表上没有锁,则在其上放置写锁。
  2. 否则,将锁请求放入写锁队列。

MySQL 授予表读锁如下:

  1. 如果表上没有写锁,则在其上放置读锁。
  2. 否则,将锁请求放入读锁队列。

值得一提的是,这取决于您使用的数据库引擎。 MyISAM将按照上述步骤锁定整个表(即使它被分成多个分区),而像InnoDB这样的引擎将执行行级锁定。

如果您没有使用 MyISAM 达到必要的性能基准,并且您已经证明您的瓶颈是通过更新等待表锁,我建议您将表的存储引擎更改为 InnoDB。

于 2010-06-09T18:38:28.387 回答