Apakah saya perlu mengindeks ulang tabel mysql setelah penghapusan massal?

10

Saya memiliki tabel di MySQL dengan banyak INSERT dan SELECT setiap detik. Dan ada sebagian besar data lama yang dihapus sekali dalam sehari. Apakah saya perlu mengindeks ulang tabel setelah menghapus? Saya ingin meningkatkan kinerja. Adakah yang bisa menyarankan beberapa tips? Menggunakan 'innodb' sebagai mesin penyimpanan. Apakah saya perlu mengubahnya? Saya pikir lebih baik untuk memasukkan dan memilih bersamaan. Tolong beri saran Anda. Apakah saya perlu melakukan pengindeksan ulang?

Terima kasih sebelumnya..

Ajay
sumber

Jawaban:

10

Apakah Anda perlu mengoptimalkan tabel saat menggunakan InnoDB? Ya dan tidak, tergantung pada beban kerja Anda dan apakah Anda mengalami masalah kinerja atau tidak.

Copy-paste yang tidak tahu malu dari dokumentasi MySQL :

Untuk tabel InnoDB, OPTIMIZE TABLE dipetakan ke ALTER TABLE, yang membangun kembali tabel untuk memperbarui statistik indeks dan membebaskan ruang yang tidak digunakan dalam indeks berkerumun. Ini ditampilkan dalam output OPTIMIZE TABLE ketika Anda menjalankannya pada tabel InnoDB, seperti yang ditunjukkan di sini:

mysql> OPTIMIZE TABLE foo;
+----------+----------+----------+-------------------------------------------------------------------+
| Table    | Op       | Msg_type | Msg_text                                                          |
+----------+----------+----------+-------------------------------------------------------------------+
| test.foo | optimize | note     | Table does not support optimize, doing recreate + analyze instead |
| test.foo | optimize | status   | OK                                                                |
+----------+----------+----------+-------------------------------------------------------------------+

Operasi ini tidak menggunakan pembuatan indeks cepat. Indeks sekunder tidak dibuat seefisien karena kunci dimasukkan sesuai urutan yang muncul pada kunci primer. Lihat Bagian 14.14.6, “Keterbatasan Pembuatan Indeks Cepat”.

InnoDB menyimpan data menggunakan metode alokasi halaman dan tidak mengalami fragmentasi dengan cara yang sama seperti mesin penyimpanan lama (seperti MyISAM). Saat mempertimbangkan apakah akan menjalankan optim atau tidak, pertimbangkan beban kerja transaksi yang akan diproses oleh server Anda:

  • Diharapkan beberapa tingkat fragmentasi. InnoDB hanya mengisi halaman 93% penuh, untuk meninggalkan ruang untuk pembaruan tanpa harus membagi halaman.

  • Hapus operasi mungkin meninggalkan celah yang membuat halaman kurang terisi dari yang diinginkan, yang bisa menjadikannya bermanfaat untuk mengoptimalkan tabel.

  • Pembaruan untuk baris biasanya menulis ulang data dalam halaman yang sama, tergantung pada tipe data dan format baris, ketika ruang yang cukup tersedia. Lihat Bagian 14.10.5, “Bagaimana Kompresi Bekerja untuk Tabel InnoDB” dan Bagian 14.12.1, “Gambaran Umum Penyimpanan Baris InnoDB”.

  • Beban kerja konkurensi tinggi mungkin meninggalkan celah dalam indeks seiring waktu, karena InnoDB mempertahankan beberapa versi dari data yang sama karena melalui mekanisme MVCC-nya. Lihat Bagian 14.5.12, “InnoDB Multi-Versi”.


sumber
5

Anda dapat mengindeks ulang tabel dan bahkan mengecilkan tabel. Namun, jika Anda ingin menunda pemeliharaan berbasis disk tersebut, Anda harus, paling tidak, menghitung ulang statistik indeks.

Tanpa menghitung ulang statistik indeks, Pengoptimal Permintaan MySQL dapat membuat pilihan yang salah untuk paket kueri EXPLAIN. Ini dapat mempengaruhi SELECT jika statistik untuk data yang tidak ada masih ada. Ini berlaku untuk MyISAM dan InnoDB.

Anda tidak perlu mengecilkan tabel untuk menghitung statistik indeks, meskipun itu akan lebih baik untuk keseluruhan kinerja.

Untuk menghitung statistik untuk semua indeks dalam sebuah tabel, Anda akan menjalankannya

ANALYZE TABLE tablename;

Anda bisa melakukan ini setiap malam. Itu tidak akan mencoba melakukan defragmenting atau penyusutan data. Anda mungkin bisa melakukannya seminggu sekali dengan berlari OPTIMIZE TABLE tablename;. Ini juga akan melakukan ANALYZE TABLE tablename;untuk Anda setelah penyusutan file fisik tabel ( .ibduntuk InnoDB atau .MYIuntuk MyISAM) atau.

RolandoMySQLDBA
sumber
3

TABEL OPTIMASI hampir tidak pernah diperlukan di InnoDB.

Apakah Anda MENGHAPUS catatan berdasarkan usia? Jika demikian, Anda dapat membuat "penghapusan massal" pada dasarnya gratis dengan menggunakan PARTITIONing dan DROP PARTITION. Lebih detail di sini: http://mysql.rjweb.org/doc.php/partitionmaint

Rick James
sumber