InnoDB
表使用行级锁定,以便多个会话和应用程序可以同时对同一个表进行读写,而不会使彼此等待或产生不一致的结果。对于该存储引擎,请避免使用锁表
语句,因为它不提供任何额外的保护,而是减少并发性。自动行级锁定使这些表适用于包含最重要数据的最繁忙的数据库,同时也简化了应用程序逻辑,因为您不需要锁定和解锁表。因此,InnoDB
存储引擎是MySQL的默认设置。
MySQL对所有存储引擎使用表锁定(而不是页、行或列锁定)InnoDB
.锁定操作本身没有太多开销。但是,由于在任何时候只有一个会话可以写入一个表,为了使用这些其他存储引擎获得最佳性能,请将它们主要用于经常查询、很少插入或更新的表。
当选择是否使用InnoDB
或者不同的存储引擎,请记住表锁定的以下缺点:
以下项目描述了一些避免或减少表锁定导致的争用的方法:
考虑将表切换到
InnoDB
存储引擎,要么使用创建表……引擎= INNODB
在安装或使用过程中ALTER TABLE……引擎= INNODB
对于已存在的表。看到第14章,InnoDB存储引擎有关此存储引擎的详细信息。优化
选择
语句以更快地运行,以便它们锁定表的时间更短。为此,您可能需要创建一些汇总表。开始mysqld与
——low-priority-updates
.对于只使用表级锁的存储引擎(例如MyISAM
,内存
,合并
),这会使所有更新(修改)表的语句优先级低于选择
语句。在这种情况下,是第二个选择
语句将在更新
声明,而不会等待第一个选择
完成。若要指定在特定连接中发出的所有更新都应以低优先级完成,请设置
low_priority_updates
服务器系统变量等于1。给出一个具体的
选择
语句优先级更高时,使用HIGH_PRIORITY
属性。看到第13.2.9节,“SELECT语句”.开始mysqld的较低值
max_write_lock_count
系统变量强制MySQL临时提高优先级的所有选择
在对表执行特定数量的写锁之后等待表的语句(例如,用于插入操作)。这允许在一定数量的写锁之后使用读锁。如果你有混合的问题
选择
而且删除
语句,限制
选项删除
也许会有帮助。看到第13.2.2节,“DELETE语句”.使用
SQL_BUFFER_RESULT
与选择
语句可以帮助缩短表锁的持续时间。看到第13.2.9节,“SELECT语句”.将表内容拆分到单独的表中可能会有所帮助,因为它允许对一个表中的列运行查询,而更新仅限于不同表中的列。
您可以更改锁定代码
mysys / thr_lock.c
使用单个队列。在这种情况下,写锁和读锁具有相同的优先级,这可能对某些应用程序有帮助。