MySQLでインデックスを維持して断片化を防ぎ、いくつかのクエリの実行を何らかの方法で最適化する方法について、多くの調査を行いました。
テーブルで使用可能な最大スペースとデータとインデックスで使用されるスペースの比率を計算する式に精通しています。
しかし、私の主な質問はまだ答えられていません。おそらく、これはSQL Serverでのインデックスのメンテナンスに精通しているためであり、MySQLでもそれはある程度似ているはずだと思う傾向があります。
SQLサーバーでは、いくつかのインデックスを設定でき、それぞれに異なるレベルの断片化を設定できます。次に、1つをピックアップして、残りに影響を与えることなく、その特定のインデックスで「REORGANIZE」または「REBUILD」操作を実行できます。
私の知る限りでは、このような「テーブルの断片化」はなく、SQL Serverは「テーブルの断片化」を修正するためのツールを提供していません。それが提供するのは、内部および外部の断片化だけでなく、インデックスの断片化(インデックスによって使用されるページ数とそのページの完全性と連続性の間の比率のように理解される)をチェックするツールです。
少なくとも私にとっては、そのすべてを理解するのは非常に簡単です。
MySQLでインデックスを維持する番になると、前述のように「テーブルの断片化」の概念しか存在しません。
MySQLのテーブルには複数のインデックスを含めることができますが、その有名な式で「断片化率」を確認すると、各インデックスの断片化が表示されず、テーブル全体が表示されます。
MySQLでインデックスを最適化したい場合、(SQL Serverのように)操作する特定のインデックスを選択しません。代わりに、テーブル全体で「OPTIMIZE」操作を実行します。これは、おそらくすべてのインデックスに影響します。
MySQLでテーブルが最適化されると、データ+インデックスVS全体のスペースによって使用されるスペースの比率が減少します。これは、ハードドライブでのある種の物理的な再編成を示唆し、物理スペースの減少につながります。ただし、インデックスの断片化は、物理的なスペースだけでなく、挿入と更新によって時間の経過とともに変更されたツリーの構造に関するものです。
最後に、InnoDB / MySQLにテーブルを取得しました。このテーブルには、300万レコード、105列、55インデックスがあります。2.1GBのインデックスを除いて1.5GBです。
このテーブルは、更新、挿入のために毎日何千回もヒットしています(実際にはレコードを削除しません)。
そのテーブルは何年も前に作成されており、誰もインデックスを維持している人はいません。
そこに巨大な断片化を見つけることを期待していましたが、規定どおりに断片化計算を実行すると
free_space / (data_length + index_length)
断片化が0.2%しかないことがわかります。私見はかなり非現実的です。
したがって、大きな質問は次のとおりです。
- テーブル全体ではなく、MySQLの特定のインデックスの断片化をチェックするにはどうすればよいですか
- SQL Serverのように、OPTIMIZE TABLEは実際にインデックスの内部/外部断片化を修正しますか?
- MySQLでテーブルを最適化すると、実際にテーブルのすべてのインデックスが再構築されますか?
- (ツリー自体を再構築せずに)インデックスの物理スペースを減らすと、実際にパフォーマンスが向上すると考えるのは現実的ですか?