Mysql 具有可交换值的两列:in()vs和

Mysql 具有可交换值的两列:in()vs和,mysql,query-optimization,Mysql,Query Optimization,我有一个表,其中两列表示用户ID。ID的顺序可以是任意一种方式,这取决于谁发起了该流程 我需要检索两个用户组合的行 为了进行测试,我在user1、user2和user2、user1上分别添加了一个密钥,但最终都没有使用 我的问题是,你们认为最快/最低的开销是什么 传统方式: SELECT * FROM table WHERE (user1 = 1 AND user2 = 2) OR (user1 = 2 AND user2 = 1) 或在以下情况下: SELECT * FROM table

我有一个表,其中两列表示用户ID。ID的顺序可以是任意一种方式,这取决于谁发起了该流程 我需要检索两个用户组合的行

为了进行测试,我在user1、user2和user2、user1上分别添加了一个密钥,但最终都没有使用

我的问题是,你们认为最快/最低的开销是什么

传统方式:

SELECT * FROM table WHERE (user1 = 1 AND user2 = 2) OR (user1 = 2 AND user2 = 1)  
或在以下情况下:

SELECT * FROM table WHERE user1 IN (1, 2) AND user2 IN (1, 2)
我在这里的操作假设是user1=user2时不存在任何记录,所以除非我遗漏了什么,否则这两种情况都会导致正确的记录


编辑:

您的模式和查询很好,MySQL只是在只有几行的情况下选择不使用索引


只需运行explain select…并亲自查看。explain告诉我,它会生成一个简单的查询,该查询已经很好了,但没有使用索引。这就是我在这里提出这个问题的原因。如果MySQL设法确定它应该使用索引合并,那么第一个查询可以使用索引。第二个查询应该能够使用它。发布实际的查询计划和表结构a也会很有帮助。这解释了很多。我不知道索引工作需要最少的行数。这两个查询似乎都很好,但旧版本会立即生成正确的记录集。看来我们赢了。非常感谢。选择索引有点复杂,取决于表的内容。当您的索引列在查询计划的“可能索引”列中,但未使用时,这意味着MySQL决定不使用它会更快。大多数情况下,在这种情况下,它也会做出正确的决定。在测试/调试索引使用时,您需要注意这一点。