我有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%')
谢谢你看看。
答案 0 :(得分:2)
我怀疑重写查询会有所帮助 你的条件的第二部分要求阅读表格的全部内容。
你可以在col5
上尝试创建另一个索引,因为documentation说明了
如果LIKE的参数是一个不以通配符开头的常量字符串,则该索引也可用于LIKE比较。
这正是您所需要的:col5 LIKE 'min%'
答案 1 :(得分:1)
但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。