Saya telah meneliti bagaimana mengoptimalkan hanya tabel terfragmentasi di MySQL dan meninjau posting ini tentang tabel mengoptimalkan . Ini pada dasarnya melakukan query terhadap database information_schema untuk tabel apa saja dengan data_free > 0
dan membangun pernyataan SQL OPTIMIZE
hanya untuk tabel tersebut. Saya menjalankan kueri ini dan mengidentifikasi 148 tabel untuk optimisasi. Semua tabel yang diidentifikasi adalah tabel InnoDB. Setelah mengeksekusi script SQL optimasi yang dihasilkan, saya menjalankan kembali script asli untuk mengidentifikasi tabel terfragmentasi dan mengembalikan tabel yang sama persis selama pass pertama.
Saya telah melihat posting yang bertentangan mengenai tabel InnoDB dan OPTIMIZE
perintahnya. Beberapa mengatakan bahwa OPTIMIZE
itu tidak akan berfungsi dengan tabel InnoDB dan Anda perlu menjalankannya ALTER TABLE table_name ENGINE=INNODB
. Yang lain mengatakan bahwa OPTIMIZE
sebenarnya memanggil ALTER TABLE
perintah ketika mengeksekusi terhadap tabel InnoDB. Dengan mengingat hal itu, saya menjalankan ALTER TABLE
perintah terhadap salah satu tabel InnoDB yang diidentifikasi terfragmentasi ( data_free > 0
) dan menemukan bahwa data_free
tidak berubah setelahnya. Ini masih lebih besar dari 0. Saya juga memulai kembali MySQL dan memeriksanya hanya untuk menemukan hasil yang sama.
Sekarang, kami memiliki beberapa server yang menjalankan MySQL 5.5.29 di organisasi kami dan saya menjalankan kueri terhadap semuanya untuk mengidentifikasi tabel InnoDB dengan DATA_FREE=0 or NULL
dan tidak ada yang dikembalikan. Mereka semua lebih besar dari nol.
Saya juga menjalankan OPTIMIZE
perintah terhadap beberapa MyISAM
tabel di mana DATA_FREE
lebih besar dari nol dan memverifikasi bahwa itu nol setelahnya.
Adakah yang bisa menjelaskan ini untukku? Apa metode yang tepat untuk menghapus fragmentasi dari tabel InnoDB? Apa metode yang tepat untuk menentukan tabel InnoDB terfragmentasi?
Terima kasih
innodb_file_per_table
juga akan menampilkan nilai yang sama untuk setiap tabel di tablespace bersama.