web-dev-qa-db-ja.com

MySQLでテーブルを最適化するにはどうすればよいですか?

COUNTYという名前のデータベースがあります。 COUNTYには断片化されたテーブルGEOがあります。 OPTIMIZE TABLE GEO GEOテーブルに対してですが、これはエラーを返しました

"テーブルは最適化をサポートしていません。代わりに再作成+分析を行ってOK"。

次に、ALTER TABLE GEO ENGINE='InnoDB';その後ANALYZE TABLE GEO.しかし、それでも断片化があります。

とうとうドロップして作り直しました。それでも断片化があります。誰かが私を助けてくれますか?どうやってデフラグできますか?

2
Krunal Patel

側面#1

あなたが見たメッセージは言っていませんでした

"テーブルは最適化をサポートしていません。代わりに再作成+分析してくださいOK"

しかしメッセージは言った

"テーブルは最適化をサポートしていないため、代わりに再作成+分析を実行してOK"

これは、InnoDBストレージエンジンがすでに実行されていることを意味します

ALTER TABLE GEO ENGINE='InnoDB';
ANALYZE TABLE GEO;

もう一度行う必要はありませんでした。

側面#2

断片化がまだ存在する理由があります

テーブルの主キーがauto_incrementの整数の場合、主キーに対して生成されたすべての数値は昇順です。

主キーがBTREEインデックスにロードされているときに、断片化が行われました。どうして?

これは意外なことかもしれませんが、約3年前の投稿に 順不同の挿入に直面してinnodbがどれほどひどく断片化するのでしょうか?

その投稿で、AVLバイナリツリーが時間の約45%で高さ回転を引き起こす方法を説明しました。 BTREEの場合、これはBTREEページ分割として表されます。ソートされたデータの意味は何ですか?

  • 昇順でデータをロードすると、左側に分割されたツリーページは常に半分いっぱいになります
  • 降順でデータをロードする場合、右側に分割されるツリーページは常に半分いっぱいになる

これらの半分のページ全体が断片化を表しています。

これは、昨年書いた別の投稿でさらに説明されています( MySQL MyISAMテーブルインデックス(別名MYIファイル)のサイズがmysqldumpインポート後に一致しないのはなぜですか? )。

結論

断片化を実際に減らす唯一の方法は、すべてのインデックスを削除してインデックスを再作成することです。テーブルが巨大である場合、これはあなたの時間の価値がありません。

3
RolandoMySQLDBA

最良の状況では、テーブルの断片化はありません。断片化を減らすために推奨されるすべてを実行しました。次の問題に移りましょう。

1
O. Jones