3

productなどのフィールドを持つ10M行のテーブルがありますcolor (int), price (float), weight (float), unitprice (int),...これで、Webのユーザーは、ランダムな条件(色はここで必須)と次のような順序でこのテーブルからデータをルックアップするクエリを動的に生成します

select * from product where color=1 and price >5 and price <220 and .... order by unitprice limit 75, 25;

select count(*) from product where color=3 and weight <500 and price <30 ... ;

MySQLでこのように約10の可能なフィルタリングフィールド(範囲、並べ替えなど)を使用してテーブル(InnoDBまたはNDB)にインデックスを付ける方法は?


編集:私の理解では、MySQLはクエリに対して1つのインデックスのみを選択する可能性が高く、複合インデックスの左側の部分のみが機能します。(color, price, weight, create_date, unitprice, ....)明らかに、すべての可能な組み合わせにインデックスを付けることは、、 (color, weight, price, create_date, unitprice, ....)、 ...などの実行可能なオプションではあり(color, unitprice, weight, ....)ません。すべての条件が必ずしもすべてのクエリに存在するわけではありません。

このテーブルにインデックスを付けるにはどうしますか?

4

2 に答える 2

1

任意のフィールドでクイックルックアップ/フィルター/ソートが必要な場合は、それらすべてにインデックスを付ける必要があります。

色が必須である場合(つまり、すべてのクエリで使用される場合)、使用する(color, field)それぞれに対して複合インデックスを作成するのが最善fieldです。

クラスター化されたインデックスを置くことも、実際にすべての一般的なクエリの一部である(color, product_id)場合は、試してみる価値があるかもしれません。color

于 2010-10-03T07:38:39.347 に答える
0

Tomalakがすでに回答しているように、おそらくすべてのフィールドにインデックスを追加する必要があります(クエリによっては複合インデックスも追加する必要があります)。しかしもちろん、これは書き込みを遅くする可能性があります。

インデックスがどのように使用されるかわからない場合は、explainコマンドを使用できます。

于 2010-10-03T09:56:48.127 に答える