Saya membuat banyak penelitian tentang cara mempertahankan indeks di MySQL untuk mencegah fragmentasi dan untuk mengoptimalkan entah bagaimana pelaksanaan beberapa pertanyaan.
Saya kenal dengan rumus yang menghitung rasio antara ruang maks yang tersedia untuk tabel VS ruang yang digunakan oleh data dan indeks.
Namun pertanyaan utama saya masih belum terjawab. Mungkin ini disebabkan oleh fakta bahwa saya terbiasa dengan pemeliharaan indeks di SQL Server, dan saya cenderung berpikir bahwa di MySQL itu harus serupa.
Di SQL server, Anda dapat memiliki beberapa indeks, dan masing-masingnya dapat memiliki tingkat fragmentasi yang berbeda. Kemudian Anda dapat mengambil satu dan melakukan operasi 'REORGANIZE' atau 'REBUILD' dalam indeks tertentu, tanpa mempengaruhi sisanya.
Sepengetahuan saya, tidak ada 'tabel fragmentasi' seperti itu, dan SQL Server tidak menyediakan alat untuk memperbaiki 'tabel fragmentasi'. Apa yang disediakannya adalah alat untuk memeriksa fragmentasi indeks (dipahami seperti rasio antara jumlah halaman yang digunakan oleh indeks VS kepenuhan halaman itu dan kedekatan), serta fragmentasi internal dan eksternal.
Semua itu cukup mudah dimengerti, setidaknya bagi saya.
Sekarang, ketika tiba giliran untuk mempertahankan indeks di MySQL, hanya ada konsep fragmentasi tabel, seperti yang disebutkan di atas.
Sebuah tabel di MySQL dapat memiliki beberapa indeks, tetapi ketika saya memeriksa 'rasio fragmentasi' dengan rumus terkenal itu, saya tidak melihat fragmentasi dari setiap indeks, tetapi tabel secara keseluruhan.
Ketika saya ingin mengoptimalkan indeks di MySQL, saya tidak memilih indeks tertentu untuk beroperasi (seperti dalam SQL Server). Sebagai gantinya, saya melakukan operasi 'MENGOPTIMALKAN' di seluruh tabel, yang mungkin mempengaruhi semua indeks.
Ketika tabel dioptimalkan dalam MySQL, rasio antara ruang yang digunakan oleh data + indeks VS ruang keseluruhan berkurang, yang menyarankan beberapa jenis pengorganisasian ulang fisik dalam hard drive, yang diterjemahkan menjadi pengurangan ruang fisik. Namun, indeks fragmentasi tidak hanya tentang ruang fisik, tetapi struktur pohon yang telah berubah seiring waktu karena sisipan dan pembaruan.
Akhirnya, saya mendapat meja di InnoDB / MySQL. Tabel itu memiliki 3 juta catatan, 105 kolom, dan 55 indeks. Ini adalah 1.5GB tidak termasuk indeks, yang 2.1GB.
Tabel itu dipukul ribuan kali setiap hari untuk memperbarui, penyisipan (kami tidak benar-benar menghapus catatan).
Tabel itu telah dibuat bertahun-tahun dan saya tahu pasti tidak ada yang mempertahankan indeks apa pun.
Saya mengharapkan untuk menemukan fragmentasi besar di sana, tetapi ketika saya melakukan perhitungan fragmentasi seperti yang ditentukan
free_space / (data_length + index_length)
ternyata saya hanya memiliki 0,2% fragmentasi. IMHO itu cukup tidak realistis.
Jadi pertanyaan besarnya adalah:
- Bagaimana cara memeriksa fragmentasi indeks tertentu di MySQL, bukan tabel secara keseluruhan
- Apakah OPTIMIZE TABLE benar-benar memperbaiki fragmentasi internal / eksternal indeks seperti pada SQL Server?
- Ketika saya mengoptimalkan tabel di MySQL, apakah itu benar-benar membangun kembali semua indeks di atas meja?
- Apakah realistis untuk berpikir bahwa mengurangi ruang fisik indeks (tanpa membangun kembali pohon itu sendiri) benar-benar diterjemahkan menjadi kinerja yang lebih baik?