在MySQL中使用UNION而不是OR?
我有一个PK在MySQL中使用UNION而不是OR?,mysql,union,sql-like,Mysql,Union,Sql Like,我有一个PK (id1, id2, col4, col5) 此查询成功地使用了我的索引,但最后一个类似(非常有用): 我想知道如何重写这个查询(或者如果可能的话),使它至少在部分查询中也使用索引。我尝试了几种使用UNION的方法,但都没有成功,但我从以下几点开始: SELECT * FROM table1 WHERE id1 = 2 AND id2 = 1 AND col4 LIKE 'min%' OR col5 LIKE 'min%' AND (col4 LIKE '%hou%' OR
(id1, id2, col4, col5)
此查询成功地使用了我的索引,但最后一个类似(非常有用):
我想知道如何重写这个查询(或者如果可能的话),使它至少在部分查询中也使用索引。我尝试了几种使用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%')
感谢您查看。我怀疑重写查询是否有帮助。
条件的第二部分仍然需要读取表的全部内容 您可以尝试在
col5
上创建另一个索引,因为
如果LIKE的参数是不以通配符开头的常量字符串,则该索引也可用于LIKE比较
这正是您需要的:
col5,比如'min%'
对不起,我无法理解第二个查询。若第一个查询运行良好,但性能较差,则需要进行全文搜索。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”、“our”、“ur”、“r”,但这会占用很多空间。在2000年早期,还没有可使用的开源搜索引擎。所以我照上面解释的做了。它运作良好。但是有很多争吵
简单地说,我推荐MyISAM的FTS。快速旁白。第一个查询可以使用:
col4,比如'min%hou%'
,这将允许使用索引。谢谢Peter-我会看看设置该索引是否会有所不同。
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%';