在MySQL中使用UNION而不是OR?

时间:2013-11-22 12:30:52

标签: mysql union sql-like

我有PK

(id1, id2, col4, col5)

此查询成功使用了我的索引,除了最后一个LIKE(非常有用):

SELECT *
FROM table1
WHERE id1 = 2 AND id2 = 1 AND col4 LIKE 'min%' AND col4 LIKE '%hou%'

我想知道如何重写此查询(或者它是否可能),因此它至少也会使用索引作为部分查询。我使用UNION尝试了几种方法都没有成功,但这就是我的开始:

SELECT *
FROM table1
WHERE id1 = 2 AND id2 = 1 AND col4 LIKE 'min%'
   OR col5 LIKE 'min%' AND (col4 LIKE '%hou%' OR col5 LIKE '%hou%')

谢谢你看看。

2 个答案:

答案 0 :(得分:2)

我怀疑重写查询会有所帮助 你的条件的第二部分要求阅读表格的全部内容。

你可以在col5上尝试创建另一个索引,因为documentation说明了

  

如果LIKE的参数是一个不以通配符开头的常量字符串,则该索引也可用于LIKE比较。

这正是您所需要的:col5 LIKE 'min%'

答案 1 :(得分:1)

抱歉,我无法理解第二次查询。如果第一个查询运行良好且性能较差,则需要全文搜索。 MyISAM具有此功能。

但InnoDB没有。在这种情况下,您可以自己完成。让我们实现简单的搜索引擎。段索引是必需的。有效地搜索col5的价值。

tbl1(tbl1_idx, id1, id2, col4, col5);
segment_tbl(tbl1_idx, col_no, val);

insert into tbl1 values('row1', '2', '1', 'minute', 'foo hour');

insert into segment_tbl values('row1', 5, 'foo');
insert into segment_tbl values('row1', 5, 'hour');

SELECT *
FROM tbl1 JOIN segment_tbl USING(tbl1_idx)
WHERE tbl1.id1 = 2 and tbl1.id2 = 1
  AND col4 LIKE 'min%'
  AND segment_tbl.col_no = 5
  AND segment_tbl.val LIKE 'hou%';

还有问题。如果col5的值是'foohour',这不起作用。因此如何细分是关键点。保存所有可能的字符序列是最好的。比如'oohour','ohour','hour','our','ur','r',但这会消耗很多空间。在2000年早些时候,没有可靠的开源搜索引擎。所以我按照上面的解释做了。它运作良好。但是有很多行。

我建议使用MyISAM的FTS。