私はMySQLで断片化されたテーブルのみを最適化する方法を調査しており、テーブルの最適化に関するこの投稿をレビューしました。基本的には、任意のテーブルについてinformation_schemaデータベースに対してクエリを実行し、それらのテーブルのみdata_free > 0
に対するSQLステートメントを作成しますOPTIMIZE
。このクエリを実行したところ、最適化のために148のテーブルが特定されました。識別されたすべてのテーブルはInnoDBテーブルです。結果の最適化SQLスクリプトを実行した後、元のスクリプトを再実行して断片化されたテーブルを識別し、最初のパスでまったく同じテーブルを返しました。
InnoDBテーブルとOPTIMIZE
コマンドに関して競合する投稿を見ました。OPTIMIZE
InnoDBテーブルでは機能せず、実行する必要があると言う人もいます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
ていない場合は、共有テーブルスペースのすべてのテーブルに同じ値が表示されると思います。