我正在尝试创建一些有用的搜索过滤器,其中包括一旦选择了选项就会过滤的子集计数。但是,对于相当大的数据表,我怀疑我的查询非常低效。我不确定有什么其他策略可以解决这个问题。
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分钟也可能会有相当过时的结果计数。
另外,如果我需要提供一些额外的数据来帮助开发替代方案,请告诉我。
答案 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);