mysql - 对 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 完成之前,不会执行其他查询(即使是那些读/写其他表的查询)。
我不知道如何调试它以及在哪里搜索任何线索。
对另一个表的所有插入都运行良好,整个数据库在不插入野生表时运行良好。
解决方案
这是从 MyISAM 迁移到 InnoDB 的一大原因。
MyISAM 允许多个同时读取 ( SELECT
),但任何类型的写入都会锁定整个表,即使是针对写入也是如此。
InnoDB 使用“行锁定”,因此对表的大多数同时访问对彼此没有明显影响。
推荐阅读
- sass - 如何修复 gulp watch 不看文件
- javascript - 如何解决这个 javascript switch 语句问题,switch 语句不起作用
- javascript - 在滚动和屏幕宽度上更改导航栏颜色
- docker - Heroku 上的“没有为进程类型 web 指定命令”
- java - doNothing.When 对于私有 void 方法本身正在调用方法
- r - 在 R 中使用 msSurv 包
- command-line-interface - 当 Spinnaker auth 为 SAML 时的 Spinnaker CLI
- python - pytest 获取当前测试文件的文件路径
- node.js - mongo db 在嵌套数组中选择嵌套数组(部分字段)
- r - 如何使用 dplyr 在层级中获取最大/秒最大值?