Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/61.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在MySQL中使用UNION而不是OR?_Mysql_Union_Sql Like - Fatal编程技术网

在MySQL中使用UNION而不是OR?

在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

我有一个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 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%';