Mengubah tabel besar dari MyISAM ke Innodb

9

Saya memiliki tabel dengan sekitar 300M baris dalam format MyISAM yang ingin saya konversi ke Innodb

Tujuan awal saya adalah untuk mengurangi penggunaan dengan mengubah skema tabel untuk memiliki indeks yang lebih sederhana. Saya membuang semua tabel, menjatuhkannya, membuatnya kembali dengan indeks yang lebih sedikit, dan sekarang saya mengimpor kembali. Namun, saya lupa menentukan bahwa itu seharusnya innodb bukan myisam.

Bisakah saya melakukan standar ALTER TABLE ... ENGINE = INNODB? Adakah yang spesial yang harus saya sadari dengan meja sebesar ini?

Operasi impor data memakan waktu sekitar 12 jam - Saya tidak suka melakukannya lagi. Karenanya mengapa saya ingin mengubahnya saja.

Will Glass
sumber
Dengan 300M baris, MyISAM mungkin lebih cepat dan lebih cocok untuk tabel sebesar itu!
Mark Henderson

Jawaban:

14

Kutipan berikut keluar dari buku " MySQL Kinerja Tinggi, Edisi Kedua ".

Ini adalah buku yang sangat bagus dan saya akan merekomendasikan ini kepada siapa pun.

Jawaban singkatnya adalah:

Dengan ukuran dan kondisi meja Anda, apa pun metode yang Anda pilih, saya pikir Anda berpotensi menunggu lama.


Konversi Tabel

Ada beberapa cara untuk mengubah tabel dari satu mesin penyimpanan ke yang lain, masing-masing dengan kelebihan dan kekurangan.

ALTER TABEL

mysql> ALTER TABLE mytable ENGINE = Falcon;

Sintaks ini bekerja untuk semua mesin penyimpanan, tetapi ada masalah: ini bisa memakan banyak waktu. MySQL akan melakukan salinan baris demi baris dari tabel lama Anda ke tabel baru. Selama waktu itu, Anda mungkin akan menggunakan semua kapasitas I / O disk server, dan tabel aslinya akan dikunci-baca saat konversi berjalan.

Buang dan impor

Untuk mendapatkan kontrol lebih besar atas proses konversi, Anda dapat memilih untuk terlebih dahulu membuang tabel ke file teks menggunakan utilitas mysqldump. Setelah membuang tabel, Anda cukup mengedit file dump untuk menyesuaikan pernyataan CREATE TABLE yang dikandungnya. Pastikan untuk mengubah nama tabel serta tipenya, karena Anda tidak dapat memiliki dua tabel dengan nama yang sama dalam database yang sama bahkan jika mereka dari tipe yang berbeda-dan mysqldump secara default untuk menulis perintah DROP TABLE sebelum CREATE TABLE , jadi Anda mungkin kehilangan data Anda jika Anda tidak hati-hati!

BUAT dan PILIH

Teknik konversi ketiga adalah kompromi antara kecepatan mekanisme pertama dan keamanan yang kedua. Daripada membuang seluruh tabel atau mengonversinya sekaligus, buat tabel baru dan gunakan sintaks MySQL SELECT ... SELECT untuk mengisinya, sebagai berikut:

mysql> CREATE TABLE innodb_table LIKE myisam_table;
mysql> ALTER TABLE innodb_table ENGINE=InnoDB;
mysql> INSERT INTO innodb_table SELECT * FROM myisam_table;

Itu bekerja dengan baik jika Anda tidak memiliki banyak data, tetapi jika Anda melakukannya, sering kali lebih efisien untuk mengisi tabel secara bertahap, melakukan transaksi antara masing-masing potongan sehingga pembatalan log tidak tumbuh besar. Dengan asumsi bahwa id adalah kunci utama, jalankan kueri ini berulang kali (menggunakan nilai x dan y yang lebih besar setiap kali) hingga Anda menyalin semua data ke tabel baru:

mysql> START TRANSACTION;
mysql> INSERT INTO innodb_table SELECT * FROM myisam_table
-> WHERE id BETWEEN x AND y;
mysql> COMMIT;

Setelah melakukannya, Anda akan dibiarkan dengan tabel asli, yang bisa Anda jatuhkan begitu selesai, dan tabel baru, yang sekarang sudah terisi penuh. Berhati-hatilah untuk mengunci tabel asli jika perlu untuk mencegah mendapatkan salinan data yang tidak konsisten!

KPWINC
sumber
2

Pernyataan ALTER TABLE pada dasarnya melakukan hal yang sama: server membuat tabel sementara di mana ia menyalin semua baris dan kemudian melakukan RENAME. Format pada disk sangat berbeda antara InnoDB dan MyISAM, jadi saya tidak berharap Anda menemukan jalan pintas untuk ini.

Komentar lain (yang mungkin Anda ketahui, tetapi akan membantu orang lain membaca ini): format on-disk untuk InnoDB sangat bergantung pada kunci utama, karena mengelompokkan catatan berdasarkan itu. Jadi ketika bekerja dengan tabel InnoDB besar, berpikir dua kali sebelum memilih kunci utama, karena mengubahnya membangun kembali seluruh tabel, seperti masalah yang dihadapi.

Lagi pula, saya sarankan melakukan beberapa tes pertama pada tabel berukuran sedang dan waktu itu.

rpetre
sumber
2
Setiap tabel yang mengubah operasi di MySQL (dan itu termasuk menambahkan indeks) membangun kembali tabel.
David Pashley