Saya memuat file 100GB melalui LOAD DATA INFILE. Saya sudah sukses dengan MyISAM, beberapa jam dan selesai.
Saya coba sekarang menggunakan InnoDB. Muatan mulai cepat di lebih dari 10MB / detik (menonton pertumbuhan file tabel, file_per_table
dihidupkan).
Tetapi setelah sekitar 5GB data melambat ke kisaran 2-4MB / detik, karena saya mendapatkan lebih dari 20GB itu turun sekitar 2MB / detik.
Ukuran buffer pool InnoDB adalah 8G. Dan saya telah melakukan hal berikut sebelum menjalankan perintah LOAD DATA INFILE:
SET @@session.sql_log_bin=0;
SET autocommit=0;
SET unique_checks=0;
SET foreign_key_checks=0;
alter table item_load disable keys;
//Run LOAD DATA INFILE....
Saya tidak bisa melihat alasan mengapa ia memulai dengan baik dan melambat seiring berjalannya waktu.
Selain itu, dengan menggunakan pengaturan yang sama, saya menjalankan perintah LOAD DATA INFILE yang sama dengan tabel menggunakan InnoDB dan MyISAM dan dataset uji 5GB, MyISAM 20x lebih cepat:
InnoDB:
mysql> LOAD DATA CONCURRENT LOCAL INFILE '/tmp/item' REPLACE INTO TABLE item_load;
Query OK, 2630886 rows affected, 6 warnings (21 min 25.38 sec)
Records: 2630886 Deleted: 0 Skipped: 0 Warnings: 6
MyISAM:
mysql> LOAD DATA CONCURRENT LOCAL INFILE '/tmp/item' REPLACE INTO TABLE item_load;
Query OK, 2630886 rows affected, 6 warnings (1 min 2.52 sec)
Records: 2630886 Deleted: 0 Skipped: 0 Warnings: 6
Ada lagi yang harus saya pertimbangkan untuk mencoba? Mesin MyISAM mampu menjaga laju muat jauh lebih baik.
Detil tambahan:
Saya sudah mencoba memuat file secara individual, tidak ada perbedaan.
Kebetulan, saya punya 150 file masing-masing 500MB, dalam setiap file kunci diurutkan.
Setelah mendapatkan 40GB dalam semalam, 12 jam kemudian, laju muat turun menjadi 0,5MB / detik, yang berarti operasi itu, secara praktis, tidak mungkin.
Saya belum menemukan jawaban lain untuk pertanyaan serupa di forum lain, sepertinya bagi saya InnoDB tidak mendukung memuat data dalam jumlah besar ke dalam tabel dengan ukuran lebih dari beberapa GB.
sumber
Jawaban akhir untuk pertanyaan ini adalah tidak menggunakan InnoDB untuk tabel referensi besar. MyISAM berteriak dengan cepat, mendekati kecepatan penuh dari kecepatan disk untuk seluruh beban, InnoDB turun. MyISAM sederhana, tetapi dalam hal ini adalah persyaratan dari tabel ini. Untuk tabel referensi sederhana dengan banyak muatan lebih dari LOAD DATA INFILE, MyISAM adalah cara yang harus ditempuh, sejauh ini bagus.
Tetapi perhatikan bahwa jika Anda menjalankan tabel MyISAM dan InnoDB, Anda perlu mempertimbangkan alokasi memori untuk 2 mekanisme caching, setiap mesin memiliki caching uniknya sendiri yang membutuhkan alokasi memori terpisah.
sumber
Anda dapat mencoba membagi file input Anda menjadi potongan yang lebih kecil.
Saya pribadi menggunakan http://www.percona.com/doc/percona-toolkit/2.1/pt-fifo-split.html untuk ini.
Apa yang terjadi jika Anda mendapatkan kunci meja untuk tabel selama impor? Mungkin penguncian baris baris dari InnoDB memperlambatnya (MyISAM menggunakan kunci tabel).
Anda juga dapat membaca di sini untuk ide lebih lanjut: http://derwiki.tumblr.com/post/24490758395/loading-half-a-billion-rows-into-mysql
sumber
Jika PK Anda bukan AUTO_INCREMENT atau data dalam file csv tidak diurutkan pada PK daripada itu mungkin mempengaruhi kinerja dataload. Karena tabel dalam MySQL adalah indeks maka semua data disimpan dalam urutan, jika nilai PK tidak pada AUTO_INCREMENT daripada MySQL harus melakukan banyak pergeseran data untuk mendapatkan data disimpan dalam urutan diurutkan. Ini adalah alasan untuk memuat data yang lebih lambat ketika ukuran tabel mulai tumbuh.
Saya memuat file csv 91GB dengan PK di AUTO_INCREMENT menggunakan LOAD DATA INFILE dan saya tidak melihat penurunan dalam throughput saya. Saya mendapatkan insert 140K hingga 145K per detik. Menggunakan Percona MySQL 5.6.38
sumber