MySQLのフラグメンテーションの概要と改善方法について資料を読み、まとめました。
(1)MySQLのフラグメンテーションの概要
1)MyISAM
可変長カラム(VARCHAR、VARBINARY、BLOB、TEXT)を含むテーブルで大量のデータ削除や大幅な変更を行った場合、削除された行がリンクリストで維持され、その後のデータ挿入時に古い行データの位置を再利用してしまう。
2)InnoDB
innodb_file_per_tableオプションが有効(デフォルトは無効)の場合、テーブルのデータとインデックスをシステムテーブルスペースではなく、.ibdファイルにテーブル単位で保存する。
追加・更新・削除操作を継続して行っているとフラグメンテーションが発生する
(2)フラグメンテーションの改善方法
1)OPTIMIZE TABLE文
①OPTIMIZE TABLE文の概要
・テーブルリペア、キーの解析、インデックスツリーのソートを行い、検索スピードが改善される。
②MyISAMの場合
・未利用スペース再利用し、データファイルをデフラグメンテーションできる。
・”myisamchk -r”でも同様に行う事が出来る。
③InnoDBの場合
.ibdファイルを再作成してデフラグメンテーションできる。
2)ALTER TABLE文
・構文
ALTER TABLE テーブル名 ENGINE=エンジン名;
・何も変更を指定せずにALTER TABLEを実行するとMySQLはテーブルをリビルドし、インデックススキャンの速度を改善することが出来る。
3)mysqldumpを実行
テーブルをテキストファイルにダンプ、テーブルをdrop、ダンプファイルからデータをリロードする。