0

さまざまな操作を行うドメインエンティティ(mysqlに保存されている)がたくさんあります。各操作は、異なるプログラムから実行されます。ビットセットとして使用される長いフィールド「flowstate」として実装したこれらのエンティティの(flow)-stateを保持する必要があります。

特定の操作を受けたエンティティをmysqlに照会するには、次のようにします。

select * from entities where state >> 7 & 1 = 1

ビット7(操作7に対応)が実行されたことを示します。(<-簡略化)

とにかく、最初はこのセットアップのパフォーマンスへの影響にはあまり注意を払っていませんでした。上記のクエリの実行がかなり遅いため、少し問題があると思います。

私が知りたいこと:「flowstate」のmysqlインデックスはまったく役に立ちますか?結局のところ、Mysqlがバイナリソートなどを使用してすばやく見つけることができる単一の値ではありません。

そうでない場合、物事をスピードアップするために私ができる他のことはありますか?。上記のようなユースケースを持つフィールドに特別な「マスクインデックス」はありますか?

TIA、Geert-jan

4

2 に答える 2

0

その場合、MySQLがインデックスを使用する方法はないと思います。ビットが常に左から右、右から左、または特定の順序で設定されることがわかっている場合は、チェックする必要のある行数を制限するトリックを実行できる可能性があります。

... where state < ? and state > ? and ...

その場合は、状態のインデックスが役立ちます。しかし、それはおそらくロングショットです。それ以外の場合、最善の策はおそらくスキーマを修正することです。

于 2010-06-11T02:34:49.850 に答える
0

ステートメントでEXPLAINを使用して、テーブルへのアクセス方法を確認します。フィールドにインデックスを付けてEXPLAINを再実行し、MySQLがそれを使用しているかどうかを確認する価値があります。テーブルがかなり大きい場合、結果間に明らかなパフォーマンスの違いがあるはずです。

于 2010-06-11T02:41:55.753 に答える