mix*_*man 7 mysql innodb myisam
我在使用LOAD DATA INFILE
. 加载操作单独运行正常。尝试LOAD DATA INFILE
并发执行操作,会阻塞 – MySQL 分析信息中的系统锁 – 直到前一个完成。这与加载到相同/不同的表,甚至不同的数据库中无关。InnoDB 没有同样的问题,但是,MyISAM 似乎更适合纯日志记录表。
可以LOAD DATA INFILE
在 MySQL 上使用 MyISAM 引擎进行并发操作吗?我是否缺少一些关键设置(DISABLE KEYS 是针对空数据库自动执行的)?在 MySQL 5.1.63 和 5.5.14 上测试。
我希望同时加载LOAD DATA INFILE
到不同的表是高性能的,但是,性能却被完全破坏了。
复制我的场景:
CREATE DATABASE test;
CREATE TABLE `log_isam` (
`id` int(20) unsigned NOT NULL AUTO_INCREMENT,
`name` varchar(255) COLLATE utf8_unicode_ci NOT NULL,
`num` int(11) DEFAULT NULL,
`surname` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM AUTO_INCREMENT=1 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
ALTER TABLE log_isam ADD INDEX num(num);
CREATE TABLE `log_isam2` (
`id` int(20) unsigned NOT NULL AUTO_INCREMENT,
`name` varchar(255) COLLATE utf8_unicode_ci NOT NULL,
`num` int(11) DEFAULT NULL,
`surname` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM AUTO_INCREMENT=1 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
ALTER TABLE log_isam2 ADD INDEX num(num);
Run Code Online (Sandbox Code Playgroud)
https://gist.github.com/4245602
CREATE DATABASE test;
CREATE TABLE `log_isam` (
`id` int(20) unsigned NOT NULL AUTO_INCREMENT,
`name` varchar(255) COLLATE utf8_unicode_ci NOT NULL,
`num` int(11) DEFAULT NULL,
`surname` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM AUTO_INCREMENT=1 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
ALTER TABLE log_isam ADD INDEX num(num);
CREATE TABLE `log_isam2` (
`id` int(20) unsigned NOT NULL AUTO_INCREMENT,
`name` varchar(255) COLLATE utf8_unicode_ci NOT NULL,
`num` int(11) DEFAULT NULL,
`surname` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM AUTO_INCREMENT=1 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
ALTER TABLE log_isam2 ADD INDEX num(num);
Run Code Online (Sandbox Code Playgroud)
MyISAM 表上的并发LOAD DATA INFILE
受到全局密钥缓存导致的互斥锁拥塞的限制。为了缓解锁拥塞,MyISAM表可以设置有自己的Key Cache。
SET GLOBAL isam_cache.key_buffer_size=8*1024;
SET GLOBAL isam_cache_two.key_buffer_size=8*1024;
CACHE INDEX log_isam IN isam_cache;
CACHE INDEX log_isam2 IN isam_cache_two;
Run Code Online (Sandbox Code Playgroud)