我的用户可以使用任意组合0到5个过滤器查询数据:
id, data, filter1, filter2, filter3, filter4, filter5
1, xxx, 1, 2, 3, 4, 5
2, yyy, 5, 6, 6, 3, 52
我认为复合索引不会起作用,因为有太多可能的组合。过滤器列上的5个单列索引是我的下一个最佳选择吗?
更新:
参考@GordonLinoff建议:
我可以添加一个键值表,而不是为过滤器定义多个列:
data_table_id, key, value
1, filter1, 1
1, filter2, 2
1, filter3, 3
1, filter4, 4
1, filter5, 5
2, filter1, 5
2, filter2, 6
2, filter3, 6
2, filter4, 3
2, filter5, 52
但是,我将如何使用原始查询:
SELECT * FROM tbl WHERE filter1 > 1 AND filter2 > 5
这个新结构?
更新:
好的,这是查询的解决方案:
SELECT * FROM results WHERE id IN(
SELECT result_id FROM (
SELECT COUNT(result_id) AS matches, result_id FROM filters
WHERE (key = "gender" AND val = 'm') OR (key = "age" AND val > 30 )
GROUP by result_id
) WHERE matches = 2
)
有异议吗?