3 GBのテーブルをMEMORYテーブルとして最適化して分析を行っていましたが、インデックスを追加することでMEMORYテーブルに役立つかどうかも知りたいと思いました。とにかくデータはすべてメモリ内にあるので、これは単に冗長ですか?
2 に答える
いいえ、冗長ではありません。
はい、引き続きインデックスを使用します。
インデックス付けされていない列を持つ小さなテーブルのメモリテーブルへのアクセス速度は、メモリ内の全表スキャンの速度が速いため、インデックス付きのテーブルとほぼ同じように見える場合がありますが、テーブルが大きくなるか、それらを結合して作成するようになります。結果セットが大きいほど違いがあります。
エンジンが使用するストレージ方法(ディスク/メモリ)に関係なく、適切なインデックスは、ストレージエンジンがそれらをサポートしている限り、パフォーマンスを向上させます。インデックスの実装方法はさまざまですが、テーブルタイプMEMORY、INNODB、およびMyISAMで実装されていることはわかっています。ところで:MEMORYテーブルのインデックスのデフォルトの方法は、Bツリーの代わりにハッシュを使用することです。
また、通常、ストレージエンジンにコーディングすることはお勧めしません。今日のメモリテーブルは、明日innodbに変更する必要があるかもしれません。SQLとスキーマはそれ自体で機能する必要があります。
いいえ、インデックス作成はデータアクセス速度とはほとんど関係がありません。インデックスは、特定のクエリを最適化するためにデータを再編成します。
たとえば、バランスの取れた二分木インデックスを100万行の列に追加すると、平均50万行ではなく、約20回の読み取り操作で必要なアイテムを見つけることができます。
したがって、その100万行をメモリに配置すると、ディスクより100倍高速になり、ブルートフォース検索が100倍高速化されます。インデックスを追加すると、DBが単に高速な検索ではなく、よりスマートな検索を実行できるようになるため、速度がさらに25,000倍向上します。
他の要因が関係しているため、これよりも複雑であり、インデックスからこれほど大きなメリットを得ることはめったにありません。よりスマートな検索も1つずつ遅くなります。これらの20のインデックスシークは、20のブルートフォースシークよりもはるかにコストがかかります。次に、インデックスのメンテナンスなどがあります。
しかし、私の提案は、可能であればデータをメモリに保持し、それらにインデックスを付けることです。