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

问题描述 投票:0回答:6

根据MySQL手册

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

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

mysql locking table-locking
6个回答
28
投票

来自(预编辑)链接

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

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


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
投票

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

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


1
投票

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

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

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

本页对第一个“更好”的定义很差。看来更好意味着“更快”。

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


0
投票

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


0
投票

我不明白为什么表级锁在这个语句上更优越

严格键上的读取和更新,您可以在其中更新或删除可以通过单个键读取获取的行: UPDATE tbl_name SET column=value WHERE unique_key_col=key_value;从 tbl_name 删除,其中 unique_key_col=key_value;

行级锁是否应该更高效,因为它只会使用 unique_key_col 锁定单行?

© www.soinside.com 2019 - 2024. All rights reserved.