Mempercepat sisipan MySQL dengan partisi di MyISAM dengan kunci unik
9
Saya memiliki tabel MyISAM yang besar (~ 30M baris). Pada titik tertentu saya telah mengubahnya ke format baris tetap, jadi sekarang tabel membutuhkan ~ 40Gb pada disk dan 2Gb untuk indeks. Tabel memiliki indeks unik dan ada 100 permintaan 'masukkan pada duplikat kunci pembaruan' per detik. Saat meja bertambah, sisipan ini menjadi semakin lambat.
Saya tidak yakin, tetapi apakah partisi akan membantu saya mempercepat pemasangan?
Pertama-tama, menulis bersamaan jelas bukan opsi untuk penyimpanan MyISAM. Masing-masing dari mereka akan mengunci seluruh tabel (kecuali untuk membaca dalam beberapa kasus). Jika InnoDB tidak cocok dengan Anda, coba TokuDB. Tetapi akan lebih lambat dibandingkan dengan MyISAM karena sifat transaksional dari mesin TokuDB (dan InnoDB tentu saja) (Anda harus menulis data yang sama setidaknya dua kali: jurnal dan file data). Juga, jika server Anda akan macet suatu hari, Anda akan menunggu berjam-jam sampai meja MyISAM 40GB Anda diperbaiki.
Jika Anda masih ingin memuat data ke dalam tabel MyISAM Anda dan ingin melakukannya dengan cepat, saya dapat merekomendasikan untuk menggunakan LOAD DATA INFILEalih-alih memasukkan. Ini adalah cara tercepat untuk memuat data dalam volume besar ke dalam tabel. Dan ya, indeks akan memperlambat kinerja penyisipan dengan cara yang eksponensial.
Sepatah kata tentang partisi: INSERT-pernyataan dalam MySQL tidak mendukung pemangkasan, sehingga semua partisi Anda akan dipindai pada setiap pernyataan untuk pencocokan indeks yang unik. Juga, semua partisi akan dikunci sampai ujung yang dimasukkan.
Apakah kueri sisipan ini bersamaan atau berasal dari proses yang sama? Jika mereka bersamaan, lebih baik menggunakan penyimpanan InnoDB untuk tabel ini karena MyISAM mengunci seluruh tabel dan InnoDB menggunakan kunci baris. Jika beralih ke penyimpanan lain bukan merupakan opsi, Anda dapat mencoba pernyataan INSERT DELAYED dan sejumlah optimasi penyisipan lainnya . Partisi tidak akan membantu kecuali Anda menempatkan partisi yang berbeda pada cakram fisik yang berbeda.
Sisipan ini bersamaan. Tapi InnoDB terlalu lambat di 'masukkan pembaruan duplikat kunci', jadi itu bukan pilihan. Sejauh yang saya tahu, IO bukanlah bottleneck - jumlah RAM >> ukuran tabel, termasuk indeks dan writecaching aktif. Saya pikir masalahnya ada di suatu tempat di kunci mysql internal atau sesuatu.
d0rc
INSERT DELAYED harus digunakan hanya untuk pernyataan INSERT yang menentukan daftar nilai. Server mengabaikan DELAYED untuk INSERT ... SELECT atau INSERT ... ON DUPLICATE KEY UPDATE statement.
llazzaro
"InnoDB terlalu lambat" - sudahkah Anda mencoba menyetelnya sedikit? Pengaturan default sangat buruk.
Apakah kueri sisipan ini bersamaan atau berasal dari proses yang sama? Jika mereka bersamaan, lebih baik menggunakan penyimpanan InnoDB untuk tabel ini karena MyISAM mengunci seluruh tabel dan InnoDB menggunakan kunci baris. Jika beralih ke penyimpanan lain bukan merupakan opsi, Anda dapat mencoba pernyataan INSERT DELAYED dan sejumlah optimasi penyisipan lainnya . Partisi tidak akan membantu kecuali Anda menempatkan partisi yang berbeda pada cakram fisik yang berbeda.
sumber