针对 MyISAM 表并发使用的 LOAD DATA INFILE 块

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到不同的表是高性能的,但是,性能却被完全破坏了。


复制我的场景:

SQL

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)

LOAD DATA log.txt 文件内容

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)

mix*_*man 2

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)