优化联合查询

问题描述:

我已经用了这是真正的长时间来执行(约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 

谢谢!

如果我正确理解您的问题,则不需要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秒。 –