首页 > 解决方案 > 对 mysql 表的单次插入会锁定整个数据库

问题描述

我的 MyIsam 表记录很少(大约 20 条):

CREATE TABLE `_cm_dtstd_37` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `NUMBER` int(10) NOT NULL COMMENT 'str',
  `DESCRIPTION` char(32) NOT NULL COMMENT 'str',
  PRIMARY KEY (`id`),
  UNIQUE KEY `PHONE` (`NUMBER`)
) ENGINE=MyISAM AUTO_INCREMENT=15 DEFAULT CHARSET=utf8 COMMENT='==CORless Numbers=='

单插入:

INSERT IGNORE INTO _cm_dtstd_37 VALUES(NULL, 55555, '55555')

执行需要很长时间(大约 5 到 7分钟)并使 MySql 服务器将每个下一个查询置于“等待”状态。在第一次 INSERT 完成之前,不会执行其他查询(即使是那些读/写其他表的查询)。

我不知道如何调试它以及在哪里搜索任何线索。

对另一个表的所有插入都运行良好,整个数据库在不插入野生表时运行良好。

标签: mysqllockingmyisam

解决方案


这是从 MyISAM 迁移到 InnoDB 的一大原因。

MyISAM 允许多个同时读取 ( SELECT),但任何类型的写入都会锁定整个表,即使是针对写入也是如此。

InnoDB 使用“行锁定”,因此对表的大多数同时访问对彼此没有明显影响。


推荐阅读