jawaban singkatnya:
select ENGINE, TABLE_NAME,Round( DATA_LENGTH/1024/1024) as data_length , round(INDEX_LENGTH/1024/1024) as index_length, round(DATA_FREE/ 1024/1024) as data_free from information_schema.tables where DATA_FREE > 0;
Jawaban "Kamu harus tahu"
pertama-tama Anda harus memahami bahwa tabel Mysql terfragmentasi ketika baris diperbarui, jadi ini adalah situasi yang normal. Ketika sebuah tabel dibuat, katakanlah diimpor menggunakan dump dengan data, semua baris disimpan tanpa fragmentasi di banyak halaman ukuran tetap. Saat Anda memperbarui baris panjang variabel, halaman yang berisi baris ini dibagi menjadi dua atau lebih halaman untuk menyimpan perubahan, dan dua halaman baru ini (atau lebih) berisi ruang kosong yang mengisi ruang yang tidak digunakan.
Ini tidak memengaruhi kinerja, kecuali tentu saja fragmentasi tumbuh terlalu banyak. Apa yang terlalu banyak fragmentasi, mari kita lihat permintaan yang Anda cari:
select ENGINE, TABLE_NAME,Round( DATA_LENGTH/1024/1024) as data_length , round(INDEX_LENGTH/1024/1024) as index_length, round(DATA_FREE/ 1024/1024) as data_free from information_schema.tables where DATA_FREE > 0;
DATA_LENGTH dan INDEX_LENGTH adalah ruang yang digunakan oleh data dan indeks Anda, dan DATA_FREE adalah jumlah total byte yang tidak digunakan di semua halaman tabel (fragmentasi).
Berikut adalah contoh tabel produksi nyata
| ENGINE | TABLE_NAME | data_length | index_length | data_free |
| InnoDB | comments | 896 | 316 | 5 |
Dalam hal ini kami memiliki Tabel menggunakan (896 + 316) = 1212 MB, dan memiliki data ruang kosong 5 MB. Ini berarti "rasio fragmentasi" dari:
5/1212 = 0.0041
... Yang merupakan "rasio fragmentasi" yang sangat rendah.
Saya telah bekerja dengan tabel dengan rasio mendekati 0,2 (artinya 20% ruang kosong) dan tidak pernah melihat perlambatan pada kueri, bahkan jika saya mengoptimalkan tabel, kinerjanya sama. Tetapi menerapkan tabel optimisasi pada tabel 800MB membutuhkan banyak waktu dan memblokir tabel selama beberapa menit, yang tidak praktis untuk produksi.
Jadi, jika Anda mempertimbangkan apa yang Anda menangkan dalam kinerja dan waktu yang terbuang untuk mengoptimalkan tabel, saya lebih suka TIDAK MENGOPTIMALKAN.
Jika menurut Anda lebih baik untuk penyimpanan, lihat rasio Anda dan lihat berapa banyak ruang yang dapat Anda hemat saat mengoptimalkan. Biasanya tidak terlalu banyak, jadi saya lebih suka TIDAK MENGOPTIMALKAN.
Dan jika Anda mengoptimalkan, pembaruan berikutnya akan membuat ruang kosong dengan membagi halaman menjadi dua atau lebih. Tapi itu lebih cepat untuk memperbarui tabel terfragmentasi daripada yang tidak terfragmentasi, karena jika tabel terfragmentasi, pembaruan pada baris tidak selalu akan membagi halaman.
Saya harap ini membantu Anda.