Ben yaklaşık 10 Milyon satır (veya 7GB) oluşan oldukça büyük bir InnoDB-Tablo toplu ithalat ile mücadele ediyorum (ki benim için şimdiye kadar çalıştığım en büyük tablo).
Inno'nun ithalat hızını nasıl artıracağımı araştırdım ve şu an kurulumum şöyle görünüyor:
/etc/mysql/my.cnf/
[...]
innodb_buffer_pool_size = 7446915072 # ~90% of memory
innodb_read_io_threads = 64
innodb_write_io_threads = 64
innodb_io_capacity = 5000
innodb_thread_concurrency=0
innodb_doublewrite = 0
innodb_log_file_size = 1G
log-bin = ""
innodb_autoinc_lock_mode = 2
innodb_flush_method = O_DIRECT
innodb_flush_log_at_trx_commit=2
innodb_buffer_pool_instances=8
import is done via bash script, here is the mysql code:
SET GLOBAL sync_binlog = 1;
SET sql_log_bin = 0;
SET FOREIGN_KEY_CHECKS = 0;
SET UNIQUE_CHECKS = 0;
SET AUTOCOMMIT = 0;
SET SESSION tx_isolation='READ-UNCOMMITTED';
LOAD DATA LOCAL INFILE '$filepath' INTO TABLE monster
COMMIT;
Veriler bir CSV
dosyada sağlanır.
Şu anda ayarlarımı her biri 2 milyon, 3 milyon, ... sıralı daha küçük 'test dökümleriyle' test ediyorum ve time import_script.sh
performansı karşılaştırmak için kullanıyorum .
Dezavantajı sadece genel bir çalışma süresi olsun, bu yüzden sonuç almak için tam içe aktarma işleminin bitmesini beklemem.
Şimdiye kadarki sonuçlarım:
- 10000 satır: <1 saniye
- 100000 satır: 10 saniye
- 300000 satır: 40 saniye
- 2 milyon sıra: 18 dakika
- 3 milyon satır: 26 dakika
- 4 milyon satır: (2 saat sonra iptal edildi)
Görünüşe göre 'yemek kitabı' çözümü yok ve kişi kendi ayarlarının en uygun karışımını bulmalı.
Kurulumumda neyi değiştireceğime dair önerilerin yanı sıra, içe aktarma sürecini nasıl daha iyi değerlendirebileceğimi / neler olduğunu ve darboğazın nerede olabileceğini daha fazla kavrayışımı nasıl artırabileceğimi de çok takdir ediyorum.
Değiştirdiğim ayarlar için belgeleri okumaya çalıştım, ancak yine de herhangi bir yan etkinin farkında değilim ve hatta performansı kötü seçilmiş bir değerle düşürebilirsem.
Şimdilik, MyISAM
içe aktarma ve değiştirme sırasında tablo motorunu kullanmak için sohbetten bir öneri denemek istiyorum .
Bunu denemek istiyorum ama şu anda benim DROP TABLE
sorgu da bitmesi saatler sürüyor. (Bu başka bir gösterge gibi görünüyor benim ayarı daha az optimal).
Ek bilgi:
Şu anda kullandığım makinede 8GB RAM ve 5400RPM ile Katı Hal Hibrit sabit sürücüsü var.
Ayrıca eski verileri söz konusu tablodan kaldırmayı hedeflerken,
a) automatic data cleanup feature
geliştirme sırasında teste biraz hızlı aktarmaya ihtiyacım var ve
b) sunucumuzun çökmesi durumunda 2. sunucumuzu bir yedek olarak kullanmak istiyoruz (ihtiyaç duyulan -veri verileri, son içe aktarma 24 saatten fazla sürdü)
mysql> SHOW CREATE TABLE monster\G
*************************** 1. row ***************************
Table: monster
Create Table: CREATE TABLE `monster` (
`monster_id` int(11) NOT NULL AUTO_INCREMENT,
`ext_monster_id` int(11) NOT NULL DEFAULT '0',
`some_id` int(11) NOT NULL DEFAULT '0',
`email` varchar(250) NOT NULL,
`name` varchar(100) NOT NULL,
`address` varchar(100) NOT NULL,
`postcode` varchar(20) NOT NULL,
`city` varchar(100) NOT NULL,
`country` int(11) NOT NULL DEFAULT '0',
`address_hash` varchar(250) NOT NULL,
`lon` float(10,6) NOT NULL,
`lat` float(10,6) NOT NULL,
`ip_address` varchar(40) NOT NULL,
`cookie` int(11) NOT NULL DEFAULT '0',
`party_id` int(11) NOT NULL,
`status` int(11) NOT NULL DEFAULT '2',
`creation_date` datetime NOT NULL,
`someflag` tinyint(1) NOT NULL DEFAULT '0',
`someflag2` tinyint(4) NOT NULL,
`upload_id` int(11) NOT NULL DEFAULT '0',
`news1` tinyint(4) NOT NULL DEFAULT '0',
`news2` tinyint(4) NOT NULL,
`someother_id` int(11) NOT NULL DEFAULT '0',
`note` varchar(2500) NOT NULL,
`referer` text NOT NULL,
`subscription` int(11) DEFAULT '0',
`hash` varchar(32) DEFAULT NULL,
`thumbs1` int(11) NOT NULL DEFAULT '0',
`thumbs2` int(11) NOT NULL DEFAULT '0',
`thumbs3` int(11) NOT NULL DEFAULT '0',
`neighbours` tinyint(4) NOT NULL DEFAULT '0',
`relevance` int(11) NOT NULL,
PRIMARY KEY (`monster_id`),
KEY `party_id` (`party_id`),
KEY `creation_date` (`creation_date`),
KEY `email` (`email`(4)),
KEY `hash` (`hash`(8)),
KEY `address_hash` (`address_hash`(8)),
KEY `thumbs3` (`thumbs3`),
KEY `ext_monster_id` (`ext_monster_id`),
KEY `status` (`status`),
KEY `note` (`note`(4)),
KEY `postcode` (`postcode`),
KEY `some_id` (`some_id`),
KEY `cookie` (`cookie`),
KEY `party_id_2` (`party_id`,`status`)
) ENGINE=InnoDB AUTO_INCREMENT=13763891 DEFAULT CHARSET=utf8
SHOW CREATE TABLE yourtable\G
bize bu 10 milyon sıralı masanın tablo yapısını göstermek için koşun .
innodb_doublewrite = 0
) devre dışı bırakarak MySQL kurulumunuz kilitlenmeyebilir: bir elektrik kesintiniz (MySQL çökmesi değil) varsa, verileriniz sessizce bozulabilir.