Saya berjuang dengan mengimpor sebagian besar InnoDB-Table cukup besar yang terdiri dari sekitar 10 Juta baris (atau 7GB) (yang bagi saya adalah meja terbesar yang pernah saya kerjakan sejauh ini).
Saya melakukan riset bagaimana meningkatkan kecepatan impor Inno dan untuk saat ini setup saya terlihat seperti ini:
/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;
Data disediakan dalam CSV
file.
Saat ini saya menguji pengaturan saya dengan 'test dumps' yang lebih kecil dengan 2 juta, 3 juta, ... masing-masing baris dan digunakan time import_script.sh
untuk membandingkan kinerja.
Kekurangannya adalah saya hanya mendapatkan waktu berjalan keseluruhan jadi saya harus menunggu impor penuh selesai untuk mendapatkan hasil.
Hasil saya sejauh ini:
- 10 000 baris: <1 detik
- 100.000 baris: 10 detik
- 300.000 baris: 40 detik
- 2 juta baris: 18 menit
- 3 juta baris: 26 menit
- 4 juta baris: (dibatalkan setelah 2 jam)
Tampaknya tidak ada solusi 'buku masak' dan kita harus mencari tahu kombinasi yang optimal dari pengaturan mereka sendiri.
Selain saran tentang apa yang harus diubah dalam pengaturan saya, saya juga akan sangat menghargai informasi lebih lanjut bagaimana saya bisa melakukan benchmark proses impor yang lebih baik / mendapatkan lebih banyak wawasan tentang apa yang terjadi dan di mana kemacetan mungkin terjadi.
Saya mencoba membaca dokumentasi untuk pengaturan yang saya ubah tetapi sekali lagi saya tidak mengetahui adanya efek samping dan jika saya bahkan menurunkan kinerja dengan nilai yang dipilih dengan buruk.
Untuk saat ini saya ingin mencoba saran dari obrolan untuk digunakan MyISAM
selama impor dan mengganti mesin tabel sesudahnya.
Saya ingin mencoba ini tetapi untuk saat ini DROP TABLE
permintaan saya juga membutuhkan waktu berjam-jam untuk menyelesaikannya. (Yang sepertinya indikator lain pengaturan saya kurang optimal).
Informasi tambahan:
Mesin yang saya gunakan saat ini memiliki 8GB RAM dan hard drive Solid State Hybrid w / 5400RPM.
Sementara kami juga bertujuan untuk menghapus data yang tidak terpakai dari tabel yang dimaksud, saya masih memerlukan impor yang agak cepat untuk
a) menguji automatic data cleanup feature
sementara mengembangkan dan
b) seandainya server kami mogok kami ingin menggunakan server 2 kami sebagai pengganti (yang membutuhkan data terkini, impor terakhir memakan waktu lebih dari 24 jam)
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
untuk menunjukkan kepada kami struktur tabel dari 10 juta baris tabel ini.
innodb_doublewrite = 0
) instalasi MySQL Anda tidak aman crash: jika Anda mengalami kegagalan daya (bukan crash MySQL), data Anda mungkin rusak secara diam-diam.