Saya bereksperimen dengan konsep ini sedikit di pekerjaan sebelumnya, di mana kami membutuhkan metode cepat menyalin skema antara server MySQL.
Memang ada overhead kinerja saat Anda menyisipkan ke tabel yang memiliki indeks sekunder. Sisipan perlu memperbarui indeks berkerumun (alias tabel), dan juga memperbarui indeks sekunder. Semakin banyak indeks yang dimiliki tabel, semakin banyak overhead yang ditimbulkannya untuk penyisipan.
InnoDB memiliki fitur yang disebut buffer perubahan yang sedikit membantu dengan menunda pembaruan indeks, tetapi pada akhirnya mereka harus digabungkan.
Penyisipan ke tabel tanpa indeks sekunder lebih cepat, jadi tergoda untuk mencoba menunda pembuatan indeks sampai setelah data Anda dimuat, seperti yang Anda jelaskan.
Percona Server, cabang MySQL, bereksperimen dengan mysqldump --optimize-keys
pilihan. Saat Anda menggunakan opsi ini, itu mengubah output mysqldump menjadi CREATE TABLE tanpa indeks, lalu INSERT all data, lalu ALTER TABLE untuk menambahkan indeks setelah data dimuat. Lihat https://www.percona.com/doc/ percona-server/TERBARU/management/innodb_expanded_fast_index_creation.html
Tetapi menurut pengalaman saya, peningkatan bersih dalam kinerjanya kecil. Masih perlu beberapa saat untuk menyisipkan banyak baris, bahkan untuk tabel tanpa indeks. Kemudian pemulihan perlu menjalankan ALTER TABLE untuk membangun indeks. Ini membutuhkan waktu untuk meja besar. Saat Anda menghitung waktu INSERT ditambah waktu ekstra untuk membuat indeks, hanya beberapa (satu digit rendah) persen lebih cepat daripada memasukkan cara tradisional, ke dalam tabel dengan indeks.
Manfaat lain dari pembuatan indeks pasca-pemrosesan ini adalah indeks disimpan lebih ringkas, jadi jika Anda perlu menghemat ruang disk, itu alasan yang lebih baik untuk menggunakan teknik ini.
Saya merasa jauh lebih bermanfaat untuk memulihkan kinerja dengan memuat beberapa tabel secara paralel .
- Alat MySQL 8.0 baru mysqlpump mendukung dump multi-utas.
- Alat sumber terbuka mydumper
mendukung dump multi-utas, dan juga memiliki alat pemulihan multi-utas, yang disebut
myloader
. Kelemahan terburuk dari mydumper/myloader adalah dokumentasinya hampir tidak ada, jadi Anda harus menjadi pengguna yang tangguh untuk mengetahui cara menjalankannya.
Strategi lain adalah dengan menggunakan mysqldump --tab
untuk membuang file CSV alih-alih skrip SQL. File CSV yang dimuat secara massal jauh lebih cepat daripada menjalankan skrip SQL untuk memulihkan data. Yah, itu membuang file SQL untuk definisi tabel, dan CSV untuk data yang akan diimpor. Itu membuat file terpisah untuk setiap tabel. Anda harus membuat ulang tabel secara manual dengan memuat semua file SQL (ini cepat), lalu gunakan mysqlimport
untuk memuat file data CSV. Alat mysqlimport bahkan memiliki --use-threads
opsi untuk eksekusi paralel.
Uji dengan hati-hati dengan jumlah utas paralel yang berbeda. Pengalaman saya adalah bahwa 4 utas adalah yang terbaik. Dengan paralelisme yang lebih besar, InnoDB menjadi hambatan. Namun pengalaman Anda mungkin berbeda, tergantung pada versi MySQL dan kapasitas kinerja perangkat keras server Anda.
Metode pemulihan tercepat dari semuanya adalah ketika Anda menggunakan alat pencadangan fisik, yang paling populer adalah Percona XtraBackup . Ini memungkinkan pencadangan cepat dan pemulihan lebih cepat. File yang dicadangkan benar-benar siap untuk disalin ke tempatnya dan digunakan sebagai file tablespace langsung. Kelemahannya adalah Anda harus mematikan Server MySQL Anda untuk melakukan pemulihan.