0

オプションが選択されるとフィルタリングされるサブセットの数を含む、いくつかの便利な検索フィルターを作成しようとしています。ただし、データテーブルがかなり大きい場合、クエリは非常に非効率的だと思います。これに取り組むために他にどのような戦略があるのか​​わかりません。

id | color | size
 1 | Red   | Small
 2 | Blue  | Large
 3 | Green | Large
 4 | Blue  | Small
 5 | Red   | Small
 6 | Red   | Small

テーブルに500k以上のレコードを持つ8つの属性列(色、サイズ、タイプなど)があります。

次のような「フィルター」を作成しようとしています。

  SELECT `color`, COUNT(`color`)
    FROM `table`
GROUP BY `color`
ORDER BY `color`

そして、次のような結果になります。

Blue  (2)
Green (1)
Red   (3)

Large (2)
Small (4)

次に、誰かがSmall(4)などのフィルターの1つを選択したら、WHERE size = Smallを追加する必要があります。そうすると、次のようになります。

  SELECT `color`, COUNT(`color`)
    FROM `table`
   WHERE `size` = 'Small'
GROUP BY `color`
ORDER BY `color`

Blue (1)
Red  (3)

しかし、これは信じられないほどゆっくりと実行され始めます。group by、order byが、おそらく一時テーブルを作成するためだと思いますか?さらに、フィルターブロックごとに異なるクエリを実行する必要があります。colorカラーフィルターの場合はSELECT 、sizeサイズフィルターの場合はSELECT。これにより、これらのgroupby/orderbyクエリのうち8つが500kデータテーブルで実行されます。これに対するより良いアプローチはありますか?

1つの落とし穴は、結果セットが常に変化しているため、5分間キャッシュしても、結果のカウントがかなり古くなる可能性があることです。

また、代替案の開発を支援するために提供する必要のある追加のデータがあるかどうかをお知らせください。

4

1 に答える 1

1

Indexon columncolorと別の on columnを追加することで、パフォーマンスが向上しますsize

CREATE INDEX size_index ON tableName (size);
CREATE INDEX color_index ON tableName (color);

また

ALTER TABLE tableName ADD INDEX size_index (size);
ALTER TABLE tableName ADD INDEX color_index (color);
于 2012-10-08T23:54:34.123 に答える