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 > 0dan membangun pernyataan SQL OPTIMIZEhanya 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 OPTIMIZEperintahnya. Beberapa mengatakan bahwa OPTIMIZEitu tidak akan berfungsi dengan tabel InnoDB dan Anda perlu menjalankannya ALTER TABLE table_name ENGINE=INNODB. Yang lain mengatakan bahwa OPTIMIZEsebenarnya memanggil ALTER TABLEperintah ketika mengeksekusi terhadap tabel InnoDB. Dengan mengingat hal itu, saya menjalankan ALTER TABLEperintah terhadap salah satu tabel InnoDB yang diidentifikasi terfragmentasi ( data_free > 0) dan menemukan bahwa data_freetidak 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 NULLdan tidak ada yang dikembalikan. Mereka semua lebih besar dari nol.
Saya juga menjalankan OPTIMIZEperintah terhadap beberapa MyISAMtabel di mana DATA_FREElebih 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_tablejuga akan menampilkan nilai yang sama untuk setiap tabel di tablespace bersama.