2012-10-08 21 views
0

我正在尝试创建一些有用的搜索筛选器,其中包含一旦选择了选项就会被筛选的子集计数。但是,对于相当大的数据表,我怀疑我的查询是非常低效的。我不确定还有什么其他策略可以解决这个问题。如何使用GROUP BY和ORDER BY来处理MySQL结果集筛选器

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

我有8个属性列(如颜色,大小,类型)与500K加表中的记录。

我试图打造“过滤器”是这样的:

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

而且将导致具有类似。

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

Large (2) 
Small (4) 

然后,一旦有人选择过滤器,如小(4)中的一个,那么我们就需要添加一个WHERE大小=小的话,那就有这样的事情。

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

Blue (1) 
Red (3) 

但是,这开始运行得非常慢。我认为这是因为按顺序排列的组可能会创建临时表?另外,必须为每个过滤器块运行不同的查询。用于彩色滤光片的SELECT color,用于尺寸滤光片的SELECT size。这导致这些groupby/orderby查询中的8个查询在500k数据表上运行。有没有更好的方法呢?

一个问题是,结果集一直在变化,所以即使缓存5分钟也可能有相当过期的结果数。

此外,请让我知道是否有一些额外的数据,我需要提供,以帮助开发替代品。

回答

1

它将通过在列color上添加Index以及在列size上添加Index来提高其性能。

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); 
+0

感谢约翰。我有索引。 –