MySQL锁定表会影响相关的视图吗?

时间:2010-06-09 18:31:44

标签: mysql views table-locking

因此,在阅读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?

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

1 个答案:

答案 0 :(得分:3)

您的视图将遇到与基础表相同的锁定。

来自locking上的MySQL参考页面:

  

MySQL将表写入锁定为   如下:

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

    MySQL将表读锁定为   如下:

         
        
    1. 如果表上没有写锁定,请对其进行读锁定。
    2.   
    3. 否则,将锁定请求放入读锁定队列。
    4.   

值得一提的是,这取决于您使用的数据库引擎。 MyISAM将遵循上述步骤并锁定整个表(即使它被拆分为多个分区),其中InnoDB之类的引擎将执行行级锁定。

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