Saya menggunakan MySQLTuner yang menunjukkan beberapa tabel terfragmentasi. Saya menggunakan
mysqlcheck --optimize -A
untuk mengoptimalkan semua tabel. Itu memperbaiki beberapa tabel tetapi MySQLTuner masih menemukan 19 tabel terfragmentasi. bagaimana saya bisa melihat tabel mana yang membutuhkan defragmenting? Mungkin TABEL MENGOPTIMAL akan bekerja di mana mysqlcheck tidak? Atau apa lagi yang harus saya coba?
Jawaban:
jawaban singkatnya:
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:
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
Dalam hal ini kami memiliki Tabel menggunakan (896 + 316) = 1212 MB, dan memiliki data ruang kosong 5 MB. Ini berarti "rasio fragmentasi" dari:
... 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.
sumber
Untuk menambahkan jawaban dari Felipe-Rojas Anda dapat menghitung rasio fragmen sebagai bagian dari permintaan:
Jika sebuah tabel terfragmentasi dalam persentase kecil (kurang dari 5%?) Maka Anda mungkin dapat membiarkannya sendiri.
Apa pun yang lebih besar dan Anda harus menilai berdasarkan penggunaan db Anda, mengunci tabel dll tentang seberapa penting defragment tabel.
sumber
Optimize Table memang akan menyelesaikan masalah yang Anda alami.
Jika Anda hanya memiliki beberapa basis data, maka Anda bisa menggunakan PHPMyAdmin untuk menelusuri semua basis data Anda. Pilih tabel dengan overhead dan kemudian pilih untuk mengoptimalkan.
Jika Anda memiliki banyak basis data, maka metode lain mungkin lebih disukai.
Saya menggunakan pengaturan skrip PHP berikut di cron untuk dijalankan setiap jam.
sumber
mysqlcheck --optimize -A
sama dengan SQLOPTIMIZE TABLE <tablename>;
Saya menemukan halaman ini dan menemukan pertanyaan oleh Felipe-Rojas dan sysadmiral sangat membantu. Tetapi dalam kasus saya, saya menjalankan kueri dalam phpMyAdmin WHM dan hanya mendapatkan TABLE_NAME tidak membantu karena database tidak terdaftar, dan beberapa database memiliki nama tabel yang sama. Jadi, menambahkan saja
TABLE_SCHEMA
akan memberikan kolom itu juga.Menunjukkan DB
Untuk "memperbaiki" saya menggunakan tautan tabel Defragment di phpMyAdmin untuk masing-masing tabel yang menghasilkan "frag_ratio" yang tinggi yang dieksekusi oleh phpMyAdmin:
sumber
Sebuah tabel menggunakan Mesin InnoDB MySQL pada dasarnya tidak perlu
OPTIMIZEd
.Nilai
Data_free
dari salah satuinformation_schema.tables
atauSHOW TABLE STATUS
sangat sering bukan nol, bahkan ketika Anda berpikir telah melakukan semua yang dapat Anda lakukan defrag tabel Anda. Lebih jauh, metrik itu hanyalah satu dari beberapa fragmentasi yang dapat dan memang terjadi. (Juga, membuang ruang dalam blok, membatalkan daftar, indeks BTrees vs data BTrees, dll, dll.Dan
innodb_file_per_table
mempersulit penggunaanData_free
. Jika tabel diibdata1
, makaData_free
merujuk ke seluruh tablespace; nomor yang agak tidak berguna. Jika tabel di.ibd
file sendiri , kemungkinan beberapa MB atau beberapa persen dari ukuran tabel, mana yang lebih besar.Hanya jika Anda telah menghapus banyak baris dan tidak berniat untuk mengisi ulang tabel, mungkin itu layak dijalankan
OPTIMIZE TABLE
.PARTITIONs
juga menunjukkan jumlah yang menggangguData_free
, karena setiap partisi biasanya menunjukkan 4-7MB "bebas". Dan ini tidak akan hilang.Mengapa Mendefragmentasi?
innodb_file_per_table=1
. Tetapi saat Anda menambahkan baris, Anda akan mengambilnya kembali dari OS.Data_free
.Catatan sejarah. Ketika saya sedang membantu DBA dengan sebagian besar tabel MyISAM, saya menemukan mungkin 2 dari 1000 tabel yang dibantu oleh bulanan
OPTIMIZE
. Sejak itu, saya telah bekerja dengan ribuan tabel InnoDB, belum menemukan masalah kinerja yang mungkin bisa ditolongOPTIMIZE
. (Tentu, ada masalah ruang disk yangOPTIMIZE
mungkin bisa membantu, tetapi itu menjadi rumit - biasanya DBA tidak memiliki cukup ruang disk untuk dijalankanOPTIMIZE
!)sumber