优化联合查询

时间:2016-03-01 18:31:38

标签: sql optimization union

我有一个用于内部搜索引擎的查询,该查询实际上很长(大约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

另外,我必须在 MyTable (约250K行)中进行2次搜索。

1-我在名称列中搜索确切的术语:' test '。这应该是整个查询结果中的第一个结果。

2-然后,我在名称列中搜索更大的术语“%test%”,而没有第一个查询的结果。

即。 :

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

1-我搜索' Robert ':

Mytable
id  name       rank
1   Robert     3

UNION 2-我搜索'% Robert %':

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

谢谢!

1 个答案:

答案 0 :(得分: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 |