InnoDB
表使用行级锁定,以便多个会话和应用程序可以同时读取和写入同一个表,而不会相互等待或产生不一致的结果。对于这种存储引擎,避免使用该LOCK TABLES
语句,因为它没有提供任何额外的保护,反而降低了并发性。自动行级锁定使这些表适用于拥有最重要数据的最繁忙的数据库,同时还简化了应用程序逻辑,因为您不需要锁定和解锁表。因此,
InnoDB
存储引擎是 MySQL 中的默认引擎。
MySQL 对除
InnoDB
. 锁定操作本身没有太多开销。但是因为在任何时候只有一个会话可以写入一个表,为了使用这些其他存储引擎获得最佳性能,主要将它们用于经常查询但很少插入或更新的表。
在选择是否使用
InnoDB
或不同的存储引擎创建表时,请记住表锁定的以下缺点:
以下各项描述了一些避免或减少由表锁定引起的争用的方法:
考虑将表切换到
InnoDB
存储引擎,要么CREATE TABLE ... ENGINE=INNODB
在设置期间使用,要么ALTER TABLE ... ENGINE=INNODB
用于现有表。有关此存储引擎的更多详细信息,请参阅 第 14 章,InnoDB 存储引擎。优化
SELECT
语句以更快地运行,以便它们锁定表的时间更短。您可能必须创建一些汇总表才能执行此操作。启动mysqld
--low-priority-updates
。_ 对于仅使用表级锁定(例如 、 和 )的存储引擎MyISAM
,MEMORY
这MERGE
使所有更新(修改)表的语句的优先级低于SELECT
语句。SELECT
在这种情况下,前面场景中的第二条语句将在该UPDATE
语句之前执行,并且不会等待第一 条语句SELECT
完成。要指定在特定连接中发出的所有更新都应以低优先级完成,请将
low_priority_updates
服务器系统变量设置为 1。要赋予特定
SELECT
语句更高的优先级,请使用该HIGH_PRIORITY
属性。请参阅 第 13.2.9 节,“SELECT 语句”。以较低的系统变量值 启动mysqld
max_write_lock_count
, 以强制 MySQL 在对表发生特定数量的写锁定后临时提升所有SELECT
等待表的语句的优先级(例如,对于插入操作)。这允许在一定数量的写锁之后读锁。如果您在同一个非事务表上混合插入和删除,
INSERT DELAYED
可能会有所帮助。请参阅 第 13.2.5.3 节,“插入延迟语句”。笔记INSERT DELAYED
已弃用;希望在未来的版本中将其删除。使用INSERT
(withoutDELAYED
) 代替。如果您对混合
SELECT
和DELETE
语句有疑问,LIMIT
选项DELETE
可能会有所帮助。请参阅 第 13.2.2 节,“DELETE 语句”。使用
SQL_BUFFER_RESULT
withSELECT
语句有助于缩短表锁定的持续时间。请参阅 第 13.2.9 节,“SELECT 语句”。将表内容拆分为单独的表可能会有所帮助,因为它允许查询针对一个表中的列运行,而更新仅限于不同表中的列。
您可以更改锁定代码
mysys/thr_lock.c
以使用单个队列。在这种情况下,写锁和读锁将具有相同的优先级,这可能有助于某些应用程序。