MySQL - 具有许多 where 条件的查询性能
MySQL - Query performance with many where conditions
假设有一个 table 看起来像这样:
姓名 |日期 |值 1 |值2 |值3 | ... |价值100
变种|日期 |浮动 |浮动 |浮动 |浮动 ...
我可以用它做 SELECT 语句,并使用 WHERE value1 > n,或者做 WHERE value1 > n AND value2 = n。
但是,如果我想包含最多包含 100 个条件的查询以根据每列中的值过滤 table 中的结果怎么办?
这可能吗?如果是,你怎么能索引它,因为索引中的最大列数是 16?我需要在 10 秒内获得任何给定 WHERE 条件组合的结果。
感谢您的见解。
请参阅我对以下问题的回答
正如您在问题的评论中提到的,table 包含这么多列并不是一个好主意。处理这种属性过滤必要性的最佳方法是使用具有多对一关系映射的单独值 table。然后你可以像这样过滤所需的值:
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"
... ;
虽然比具有数百列的 table 更好,但随着 "values" 的数量增加,这仍然会变得非常难看。我会考虑使用外部 free-text/attribute 搜索引擎或索引器。
假设有一个 table 看起来像这样:
姓名 |日期 |值 1 |值2 |值3 | ... |价值100 变种|日期 |浮动 |浮动 |浮动 |浮动 ...
我可以用它做 SELECT 语句,并使用 WHERE value1 > n,或者做 WHERE value1 > n AND value2 = n。
但是,如果我想包含最多包含 100 个条件的查询以根据每列中的值过滤 table 中的结果怎么办?
这可能吗?如果是,你怎么能索引它,因为索引中的最大列数是 16?我需要在 10 秒内获得任何给定 WHERE 条件组合的结果。
感谢您的见解。
请参阅我对以下问题的回答
正如您在问题的评论中提到的,table 包含这么多列并不是一个好主意。处理这种属性过滤必要性的最佳方法是使用具有多对一关系映射的单独值 table。然后你可以像这样过滤所需的值:
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"
... ;
虽然比具有数百列的 table 更好,但随着 "values" 的数量增加,这仍然会变得非常难看。我会考虑使用外部 free-text/attribute 搜索引擎或索引器。