【问题标题】:How to search in multiple columns?如何在多个列中搜索?
【发布时间】:2016-02-24 16:45:18
【问题描述】:

这是我的桌子:

// table
+----+------+------+
| id | col1 | col2 |
+----+------+------+
| 1  | 1    | 1    |
| 2  | 1    | 2    |
| 3  | 1    | 3    |
| 4  | 2    | 1    |
| 5  | 2    | 2    |
| 6  | 3    | 1    |
| 7  | 3    | 2    |
| 8  | 3    | 3    |
| 9  | 3    | 4    |
| 10 | 3    | 5    |
+----+------+------+

现在我想同时搜索col1col2。像这样的:

 select * from table where col1,col2 IN (1,2);

我想要这个输出:

+----+------+------+
| id | col1 | col2 |
+----+------+------+
| 1  | 1    | 1    |
| 2  | 1    | 2    |
| 3  | 1    | 3    |
| 4  | 2    | 1    |
| 5  | 2    | 2    |
| 6  | 3    | 1    |
| 7  | 3    | 2    |
+----+------+------+

好吧,我的问题在于这部分:... where col1,col2 IN (1,2)。我该如何解决?

注意:我可以这样做:... where col1 IN (1,2) or ,col2 IN (1,2)。但是这样,我必须在每列上创建两个单独的索引。虽然我想要一个需要像这样的组索引的查询:KEY NameIndex (col1, col2)

【问题讨论】:

  • 试试WHERE 1 IN (col1,col2) OR 2 IN (col1,col2)
  • @GiorgosBetsos 好的 tnx,只是您的解决方案比这更好吗? where col1 IN (1,2) or ,col2 IN (1,2) ?
  • 使用EXPLAIN 查看我推荐的谓词是否使用您的复合索引。如果没有,那么我的建议是无用的。
  • @GiorgosBetsos 啊,我明白了,是的,我喜欢消除两个单独的单个索引!只是一件事,有一种方法可以做到这一点吗? WHERE (col1,col2) IN (1,2) ?
  • 我也怀疑我的建议是否有效。我认为您将需要在 col1col2 上使用两个单独的索引,因为这是您查找的本质。查看here,了解复合索引的工作原理。

标签: mysql search indexing where-clause


【解决方案1】:

你想要这个,对吗?

WHERE col1 IN (1,2)
   OR col2 IN (1,2)

如果是这样,请将OR 转换为UNION。 (这是一种常见的优化技巧。)

( SELECT ... WHERE col1 IN (1,2) )
UNION DISTINCT  -- since there are likely to be dups
( SELECT ... WHERE col2 IN (1,2) );

并为每个SELECT提供最优索引:

INDEX(col1),
INDEX(col2)

这两列的复合索引不够

(Appologies——这可能是许多脱节的 cmets 中最好的一个总结。)

【讨论】:

  • OOC,你为什么不直接使用WHERE col1 IN (x) OR vol2 IN (x) 概念?
  • 在该构造中不会使用索引。 UNION 虽然比较麻烦,但可以优化每个SELECTs
  • OTOH,如果大多数列的值为 1 或 2,我的 SQL 也不会使用索引。这是因为执行表扫描通常比使用非选择性索引更快。在这种情况下,OR 会更快。
  • 所以我猜答案(与 SQL 一样),是 SELECT+UNION 的想法应该更快,但你不能比比较计划更好;)
猜你喜欢
  • 2016-02-21
  • 2022-01-09
  • 1970-01-01
  • 2016-03-19
  • 1970-01-01
  • 2011-03-12
  • 2017-04-15
  • 1970-01-01
相关资源
最近更新 更多