代码之家  ›  专栏  ›  技术社区  ›  Jason Baker

为什么对于大型表,表级锁定优于行级锁定?

  •  29
  • Jason Baker  · 技术社区  · 14 年前

    根据 MySQL manual :

    对于大型表,表锁定通常比行锁定好,

    为什么会这样?我假设行级锁定更好,因为当您锁定一个较大的表时,您锁定的是更多的数据。

    5 回复  |  直到 14 年前
        1
  •  22
  •   µBio    14 年前

    来自(预编辑) link

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

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

        2
  •  16
  •   DVK    14 年前
    • 行锁定比表级或页级锁定需要更多的内存。

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

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

    • 行级锁定的优点:

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

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

      • 表的大多数语句都是读取的。
      • 读取并更新严格键,在严格键上更新或删除可以用单个键读取的行: UPDATE tbl_name SET column=value WHERE unique_key_col=key_value; DELETE FROM tbl_name WHERE unique_key_col=key_value;
      • 选择与并发的insert语句相结合,以及极少的update和delete语句。
      • 在整个表上进行许多扫描或分组操作,但没有任何写入程序。
        3
  •  1
  •   S.Lott    14 年前

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

    为了实现非常高的锁速度,mysql使用表锁

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

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

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

        4
  •  1
  •   Raj More    14 年前

    对于正在进行主要数据修改的大型表,表级锁更好。这使得系统可以处理表上的单个锁,而不必处理gazillion锁(每行一个)。

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

        5
  •  0
  •   SQLMenace    14 年前

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