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.
Jawaban:
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
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:
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:
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!
sumber
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.
sumber