37

根据MySQL 手册

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

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

4

5 回答 5

28

来自(预编辑)链接

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

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

于 2010-08-11T20:47:05.247 回答
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 操作,而无需任何写入者。
于 2010-08-11T20:47:38.737 回答
2

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

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

于 2010-08-11T20:46:08.417 回答
1

Table locking enables many sessions to read from a table at the same time

To achieve a very high lock speed, MySQL uses table locking

"I would presume that row-level locking is better because" [you lock less data].

First "better" is poorly defined in this page. It appears that better means "faster".

Row-level locking cannot (in general) be faster because of contention for locks. Locking each row of a large result set means the very real possibility of a conflict with another large result set query and a rollback.

于 2010-08-11T20:52:17.873 回答
0

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

于 2010-08-11T20:46:31.287 回答