LOAD DATA INFILE-Blöcke bei gleichzeitiger Verwendung für MyISAM-Tabellen

7

Ich habe Probleme beim gleichzeitigen Laden von Daten in MyISAM-Tabellen LOAD DATA INFILE. Der Ladevorgang funktioniert isoliert einwandfrei. Beim gleichzeitigen Versuch, LOAD DATA INFILEVorgänge auszuführen, werden MySQL-Profilinformationen blockiert - eine Systemsperre -, bis die vorherige abgeschlossen ist. Dies geschieht unabhängig vom Laden in dieselbe / eine andere Tabelle oder sogar in eine andere Datenbank. InnoDB hat nicht die gleichen Probleme, MyISAM scheint jedoch besser für eine reine Protokollierungstabelle geeignet zu sein.

Können gleichzeitige LOAD DATA INFILEVorgänge mit der MyISAM-Engine unter MySQL ausgeführt werden? Fehlen mir einige wichtige Einstellungen (DISABLE KEYS wird automatisch für eine leere Datenbank ausgeführt)? Getestet unter MySQL 5.1.63 und 5.5.14.

Ich habe erwartet, dass das gleichzeitige Laden LOAD DATA INFILEin verschiedene Tabellen performant ist, aber die Leistung wird stattdessen vollständig zerstört.


So replizieren Sie mein Szenario:

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);

LOAD DATA log.txt Dateiinhalt

https://gist.github.com/4245602

Shell-Skript

MYSQL_USER=root
MYSQL_PASS=PASS
time mysql -u$MYSQL_USER -p$MYSQL_PASS -e \
    "LOAD DATA INFILE '/tmp/log.txt' \
     INTO TABLE log_isam FIELDS TERMINATED BY ','" test & \
time mysql -u$MYSQL_USER -p$MYSQL_PASS -e \
    "LOAD DATA INFILE '/tmp/log.txt' \
     INTO TABLE log_isam2 FIELDS TERMINATED BY ','" test
Mixman
quelle

Antworten:

2

Die gleichzeitige Verwendung LOAD DATA INFILEvon MyISAM-Tabellen ist durch eine Mutex-Überlastung aufgrund eines globalen Schlüsselcaches begrenzt. Um die Überlastung der Sperren zu verringern, können MyISAM-Tabellen so eingestellt werden, dass sie über einen eigenen Schlüsselcache verfügen.

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;
Mixman
quelle
Da meine Antwort nicht geholfen hat, kann ich sie entfernen. +1 für dich !!!
RolandoMySQLDBA