MySQL - 在许多条件下查询性能

时间:2018-05-01 02:24:33

标签: mysql performance select indexing where

让我们说有一个看起来像这样的表:

名称|日期| value1 | value2 | value3 | ...... | value100 varchar |日期|漂浮|漂浮|漂浮|漂浮......

我可以用它做SELECT语句,并使用WHERE value1> n,或做WHERE value1> n AND value2 = n。

但是,如果我想包含多达100个条件的查询,以根据每列中的值过滤表中的结果,该怎么办?

这可能吗?如果是,你怎么能去索引这个,因为索引中的最大列数是16?我将在10秒内完成WHERE条件的任何给定组合的结果。

感谢您的见解。

1 个答案:

答案 0 :(得分:0)

请参阅我对以下问题https://stackoverflow.com/a/45611294/2350861

的回答

正如你的问题评论中所提到的,拥有一个包含这么多列的表并不是一个好主意。处理属性过滤的这种必要性的最佳方法是使用具有多对一关系映射的单独值表。然后你可以过滤所需的值,如下所示:

SELECT * FROM table a where conditional = X 
AND a.PrimaryId IN 
(SELECT P_Id FROM values WHERE ValueType = "value1" AND ValueValue = "x" AND P_Id = a.PrimaryId)
AND a.PrimaryId IN 
(SELECT P_Id FROM values WHERE ValueType = "value2" AND ValueValue = "y" AND P_Id = a.PrimaryId)
.... ;

您也可以使用INNER JOINS

SELECT * from table a where conditional = X
INNER JOIN values b
INNER JOIN values c
WHERE a.P_Id = b.P_Id AND a.P_Id = c.P_Id ...
AND b.ValueType = "value1" AND b.ValueValue = "x"
AND c.ValueType = "value2" AND c.ValueValue = "y"
... ;

虽然比拥有数百列的表更好,但随着“值”数量的增加,这仍然会变得非常难看。我会考虑使用外部自由文本/属性搜索引擎或索引器。