【问题标题】:Why is table-level locking better than row-level locking for large tables?为什么大表的表级锁定优于行级锁定?
【发布时间】:2010-08-12 04:58:02
【问题描述】:

根据MySQL manual

对于大表,表锁往往比行锁好,

这是为什么?我认为行级锁定更好,因为当您锁定更大的表时,您会锁定更多数据。

【问题讨论】:

    标签: mysql locking table-locking


    【解决方案1】:

    来自(预编辑)link

    在大部分表上使用时比页级或表级锁要慢,因为您必须获得更多锁

    如果您只命中一两行,请使用行级锁。如果您的代码命中许多行或未知行,请坚持使用表锁。

    【讨论】:

    • 我明白了。因此,如果将其表述为“对于大型结果集,表锁定通常比行锁定更好”也许会更好。
    【解决方案2】:
    • 行锁定比表级或页级锁定需要更多内存。

    • 必须通过行锁定获得更多的锁,这会消耗更多的资源

    来自http://www.devshed.com/c/a/MySQL/MySQL-Optimization-part-2/

    • 行级锁定的优点:

      • 在多个线程中访问不同行时,锁冲突更少。
      • 回滚的更改更少。
      • 可以长时间锁定单行。
    • 行级锁定的缺点:

      • 比页级或表级锁占用更多内存。
      • 在大部分表上使用时比页级或表级锁慢,因为您必须获得更多锁。
      • 如果您经常对大部分数据进行 GROUP BY 操作,或者如果您经常必须扫描整个表,那么肯定比其他锁更糟糕。
      • 使用更高级别的锁,您还可以更轻松地支持不同类型的锁来调整应用程序,因为锁开销低于行级锁。
    • 在以下情况下,表锁优于页级或行级锁:

      • 该表的大多数语句都是读取的。
      • 读取和更新严格键,您可以在其中更新或删除可以使用单个键读取的行: UPDATE tbl_name SET column=value WHERE unique_key_col=key_value; DELETE FROM tbl_name WHERE unique_key_col=key_value;
      • SELECT 与并发 INSERT 语句相结合,并且很少有 UPDATE 和 DELETE 语句。
      • 对整个表进行多次扫描或 GROUP BY 操作,而无需任何写入者。

    【讨论】:

      【解决方案3】:

      row 表级锁更适合发生重大数据修改的大表。这让系统可以处理表上的单个锁,而不必处理大量锁(每行一个锁)。

      RDBMS 在内部自动升级锁定级别。

      【讨论】:

      • 我认为你的意思是“行锁更好......”:P
      【解决方案4】:

      表锁定允许多个会话同时从表中读取数据

      为了达到非常高的锁定速度,MySQL 使用了表锁定

      “我认为行级锁定更好,因为”[您锁定的数据更少]。

      第一个“更好”在此页面中定义不明确。似乎更好的意思是“更快”。

      由于锁的争用,行级锁定(通常)不能更快。锁定大型结果集的每一行意味着与另一个大型结果集查询发生冲突和回滚的可能性非常大。

      【讨论】:

        【解决方案5】:

        一般来说,如果您需要锁定大量数据,那么大表上的 1 个锁比一大堆行级或页锁便宜

        【讨论】:

          猜你喜欢
          • 2013-09-23
          • 1970-01-01
          • 2015-03-18
          • 2010-10-02
          • 1970-01-01
          • 1970-01-01
          • 2021-01-11
          • 2014-05-13
          • 1970-01-01
          相关资源
          最近更新 更多