私はMySQLで断片化されたテーブルのみを最適化する方法を調査しており、テーブルの最適化に関するこの投稿をレビューしました。基本的には、任意のテーブルについてinformation_schemaデータベースに対してクエリを実行し、それらのテーブルのみdata_free > 0に対するSQLステートメントを作成しますOPTIMIZE。このクエリを実行したところ、最適化のために148のテーブルが特定されました。識別されたすべてのテーブルはInnoDBテーブルです。結果の最適化SQLスクリプトを実行した後、元のスクリプトを再実行して断片化されたテーブルを識別し、最初のパスでまったく同じテーブルを返しました。
InnoDBテーブルとOPTIMIZEコマンドに関して競合する投稿を見ました。OPTIMIZEInnoDBテーブルでは機能せず、実行する必要があると言う人もいますALTER TABLE table_name ENGINE=INNODB。InnoDBテーブルに対して実行するときOPTIMIZEに実際にALTER TABLEコマンドを呼び出すという人もいます。そのことを念頭に置いて、ALTER TABLEフラグメント化されていると識別されたInnoDBテーブルの1つに対してコマンドを実行し(data_free > 0)、data_freeその後は変更されないことがわかりました。それはまだ0より大きいです。また、MySQLを再起動し、同じ結果を見つけるためだけにチェックしました。
これで、MySQL 5.5.29を実行しているサーバーがいくつか組織にあり、それらすべてに対してクエリを実行して、InnoDBテーブルを特定しましたがDATA_FREE=0 or NULL、何も返されませんでした。それらはすべてゼロより大きいです。
また、ゼロより大きいOPTIMIZEいくつかのMyISAMテーブルに対してコマンドを実行し、DATA_FREE後でそれがゼロであることを確認しました。
誰かがこれについて私にいくつかの光を当てることができますか?InnoDBテーブルから断片化を削除する適切な方法は何ですか?断片化されたInnoDBテーブルを特定する適切な方法は何ですか?
ありがとう
innodb_file_per_tableていない場合は、共有テーブルスペースのすべてのテーブルに同じ値が表示されると思います。