2016-03-01 121 views
1

我已經用了這是真正的長時間來執行(約3" 站內搜索引擎查詢或更多)。優化聯合查詢

我如何改進/優化/‘讓它更快’它,因爲我需要做「聯盟」兩個查詢的

SELECT id, name, rank, 1 as SortKey FROM MyTable WHERE name LIKE 'test' 
UNION SELECT id, name, rank, 2 as SortKey FROM MyTable WHERE name LIKE '%test%' 
ORDER BY CASE WHEN SortKey > 0 THEN 0 
       WHEN rank > 0 THEN 1 
       WHEN rank = 0 THEN 2 
       ELSE 3 END, 
SortKey ASC, rank ASC LIMIT 0,12 

另外,我必須做2個搜索在MyTable的(約25萬線)

1 - 我尋找確切的詞:?「測試 '在名字欄中。這應該是整個查詢結果中的第一個結果。

2-然後,我在名稱列中搜索較大的術語「%test%」,而沒有第一個查詢的結果。

I.e. :

Mytable 
id name  rank 
1 Robert  3 
2 Roberta 5 
3 Mark  8 
4 Sophia  12 
5 Robertina 1 

1 - 我做 '羅伯特' 搜索:

Mytable 
id name  rank 
1 Robert  3 

UNION 2 - 我做一搜 '%羅伯特%':

Mytable 
id name  rank 
1 Robert  3 
2 Roberta 5 
5 Robertina 1 

最終結果:

Mytable 
id name  rank 
1 Robert  3 
5 Robertina 1 
2 Roberta 5 

謝謝!

回答

0

如果我正確理解您的問題,則不需要union結果。

SELECT id, name, rank 
FROM MyTable 
WHERE name LIKE '%test%' 
ORDER BY CASE WHEN name = 'test' THEN 0 ELSE 1 END, rank ASC 
LIMIT 0,12 

的MySQL 5.6架構設置:您可以使用條件排序完成同樣的結果

create table Mytable (id int, name varchar(100),  rank int); 

insert into Mytable values 
(1, 'Robert',  3), 
(2, 'Roberta', 5), 
(3, 'Mark',  8), 
(4, 'Sophia',  12), 
(5, 'Robertina', 1); 

查詢

SELECT id, name, rank 
FROM MyTable 
WHERE name LIKE '%Robert%' 
ORDER BY CASE WHEN name = 'Robert' THEN 0 ELSE 1 END, rank ASC 
LIMIT 0,12 

結果

| id |  name | rank | 
|----|-----------|------| 
| 1 | Robert | 3 | 
| 5 | Robertina | 1 | 
| 2 | Roberta | 5 | 
+0

感謝sgedded。我使用時間計數器在極簡主義PHP腳本上進行嘗試,您的建議在UNION的0.628秒時爲1.652秒。 –