2013-11-22 52 views
1

我有在MySQL中使用UNION而不是OR?

(id1, id2, col4, col5) 

一個PK這個查詢成功使用我的索引除了最後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

快放一邊。第一個查詢可以使用:'col4 LIKE'min%hou%'''這將允許使用索引。 – Jim

回答

2

我懷疑重寫查詢會有所幫助。
您的條件的第二部分需要閱讀表的全部內容。

你可以嘗試創建另一個指標col5,因爲documentation指出

該指數也可以用於LIKE比較,如果LIKE的參數是一個字符串常量,不帶啓動通配符。

而這正是你所需要的:col5 LIKE 'min%'

+0

謝謝彼得 - 我會看看如果設置該指數有所作爲。 – Shaun

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。