【问题标题】:Do MySQL Locked Tables affect related Views?MySQL 锁定表会影响相关视图吗?
【发布时间】:2011-03-01 19:49:47
【问题描述】:

所以在阅读了Performance in PDO / PHP / MySQL: transaction versus direct execution 关于性能问题之后,我正在考虑我对 MySQL 中的锁定表进行了一些研究。

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

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

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

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

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

【问题讨论】:

    标签: mysql views table-locking


    【解决方案1】:

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

    来自locking 上的 MySQL 参考页面:

    MySQL 授予表写锁为 如下:

    1. 如果表上没有锁,就给它加一个写锁。
    2. 否则,将锁请求放入写锁队列。

    MySQL 授予表读锁为 如下:

    1. 如果表上没有写锁,就给它加一个读锁。
    2. 否则,将锁请求放入读锁队列。

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

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

    【讨论】:

    • 感谢您的回答。我修改了我的问题以询问缓存。如果一个查询被缓存,它会取代锁,还是只有在锁打开后才返回缓存的查询结果?
    • @CogitoErgoSum:不,查询计划缓存不会影响隔离级别。
    猜你喜欢
    • 2010-11-12
    • 2018-03-03
    • 2023-02-03
    • 1970-01-01
    • 2018-09-28
    • 1970-01-01
    • 1970-01-01
    • 2013-05-27
    • 2010-10-06
    相关资源
    最近更新 更多