合成索引中的OR问题
|
在我的许多查询中,我遇到的情况是
SELECT * from myTable m
where m.userId = :userId
AND (m.to = :contactNumber OR m.from = :contactNumber)
AND .....
所以我为(userId,to,from)制作了一个复合索引
如果将OR
替换为AND
,则效果很好,但如果是OR
,则仅将索引用于userId
。
我有点困惑为什么会发生这种情况,还有没有更好的方法对此进行索引以提高性能,可能是将它们全部单独索引?
没有找到相关结果
已邀请:
2 个回复
播匣扦阔食
浅镁
上排序。在每个
中,它们将按
进行排序,在每个组中,它们将按
进行排序。 这意味着,尽管您可以使用该索引查找特定的
值,
对和
三元组,但是查找特定的
对并不太好。这是因为这些值将在索引顺序中位于许多不同的位置,因为
是比
更高级的键。 一种方法是在
上放置一个额外的索引,然后在联合中使用两个单独的查询,这两个查询都可以使用自己的索引来有效地查找行。就像是:
第一个查询很可能会使用原始索引,因为ѭ10是它的两个顶级组件。您也可以为此指定一个索引,但是由于您已经有了一个可用的索引,所以它可能不是必需的(并且该索引可用于您希望包含所有三个组成部分的行的其他查询)。 第二个查询可能会使用新索引来有效地查找其行。
将组合两个查询并删除重复的查询。这与原始查询的意图匹配。如果您知道查询之间可能没有交叉,则可以使用
跳过(不必要的)重复删除步骤,但是我认为您不能在此处执行此操作。 该方法还具有潜在的优势,即在支持它的数据库中容易受到并行性的影响(查询可以并行运行,并且在两个查询完成后就可以合并)。 现在请记住,这是一般性建议。我本人是一个DB2专家,所以我在这里提出的内容是基于有关数据库内部工作方式的一般知识,而不是有关MySQL的细节。 您仍然应该测试查询以确保它们按预期方式工作(但是即使我是MySQL的作者,我也想这样做)。换句话说,我已经不知道我在这里说过多少遍了,算了,不要猜测!