为什么针对大型表,表级锁定比行级锁定更好?

38
根据MySQL手册的说法:

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

为什么呢?我认为行级锁更好,因为锁定较大的表时,锁定的数据更多。
5个回答

28

来自(预编辑)链接

当应用于表的大部分时,比页面级或表级锁定更慢,因为您必须获取更多锁定

如果只涉及一两行数据,请使用行级锁。如果您的代码会访问很多或不知道的行,请坚持使用表锁。


11
明白了,那么也许最好将其表述为“对于大型结果集,表锁定通常比行锁定更好”。 - Jason Baker

19
  • 行级锁需要比表级或页面级锁使用更多的内存。

  • 使用行级锁时需要获取更多的锁,这会消耗更多资源。

来源: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 操作而没有任何写入者。

2

对于进行大量数据修改的大型表格,使用"行"级别锁定更好。这样系统只需处理单个表格锁定而不是大量的锁定(每一行都有一个)。

关系型数据库管理系统会自动升级锁定级别。


我想你的意思是“行锁更好...” :P - Jon Black

1
表锁定使许多会话可以同时从表中读取
为了实现非常高的锁定速度,MySQL使用表锁定

"我认为行级锁定更好,因为" [你锁定的数据更少]。

首先,在本页中,“更好”定义不清。看起来更好意味着“更快”。

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


0
通常情况下,如果您需要锁定大量数据,则在一个大表上进行1次锁定比进行整个一堆行级或页面锁定要便宜。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接