如何使用GROUP BY和ORDER BY处理MySQL结果集过滤器

时间:2012-10-08 23:49:53

标签: mysql

我正在尝试创建一些有用的搜索过滤器,其中包括一旦选择了选项就会过滤的子集计数。但是,对于相当大的数据表,我怀疑我的查询非常低效。我不确定有什么其他策略可以解决这个问题。

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

我有8个属性列(例如颜色,大小,类型),表中有500多个记录。

我正在尝试创建“过滤器”,例如:

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

会产生类似的结果。

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

Large (2)
Small (4)

然后,一旦有人选择了其中一个过滤器,例如Small(4),那么我们需要添加一个WHERE size = Small,然后就会有类似的东西。

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

Blue (1)
Red  (3)

但是,这开始以非常缓慢的速度运行。我认为这是因为按顺序分组可能会创建临时表?另外,必须为每个过滤器块运行不同的查询。用于滤色器的SELECT color和用于尺寸过滤器的SELECT size。这导致在500k数据表上运行8个这样的groupby / orderby查询。有更好的方法吗?

一个问题是,结果集一直在变化,因此即使缓存5分钟也可能会有相当过时的结果计数。

另外,如果我需要提供一些额外的数据来帮助开发替代方案,请告诉我。

1 个答案:

答案 0 :(得分:1)

它会通过在Index列上添加color而在列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);