オプションが選択されるとフィルタリングされるサブセットの数を含む、いくつかの便利な検索フィルターを作成しようとしています。ただし、データテーブルがかなり大きい場合、クエリは非常に非効率的だと思います。これに取り組むために他にどのような戦略があるのかわかりません。
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分間キャッシュしても、結果のカウントがかなり古くなる可能性があることです。
また、代替案の開発を支援するために提供する必要のある追加のデータがあるかどうかをお知らせください。