使用UNION查找MySQL查询替代方案 - 以便比较它们的速度

时间:2015-02-18 12:10:48

标签: mysql performance

我有一个查询,根据用户提供的短语(例如“ge”)从topics表中选择行。每个用户都有他们关注的主题列表。我按priority列(作为别名)订购结果:

  • 优先级4 - 完全匹配,短语位于用户遵循的列表中 主题
  • 优先级3 - 部分匹配,短语位于用户关注列表中 主题
  • 优先级2 - 部分匹配,以短语
  • 开头的主题
  • 优先级1 - 部分匹配,短语是主题名称的子字符串

我使用的查询UNION

SELECT id, name, 4 as priority FROM `topics`
WHERE id IN(17, 18, 19, 20, 21) AND name LIKE 'ge'

UNION

SELECT id, name, 3 as priority FROM `topics`
WHERE id IN(17, 18, 19, 20, 21) AND name LIKE '%ge%'

UNION

SELECT id, name, 2 as priority FROM `topics`
WHERE name LIKE 'ge%'

UNION

SELECT id, name, 1 as priority FROM `topics`
WHERE name LIKE '%ge%'

ORDER BY priority DESC

查询工作正常 - 它获取匹配结果并按priority从最高到最低排序。

我需要的是提出实现相同目标的替代查询/查询,以比较其100 000条记录的速度。

上面的查询有什么好的替代方案?我应该关注子查询吗?加入?我想以最有效的方式结束。

2 个答案:

答案 0 :(得分:0)

您可以替换

WHERE name LIKE 'ge%'

的类似替代方案
WHERE MATCH(name) AGAINST('ge*' IN BOOLEAN MODE)

答案 1 :(得分:0)

部分加速是创建一个TEMPORARY TABLE,其中所有行WHERE NAME LIKE'%ge%',然后在该表上运行UNION。临时表(希望)会更小,因此更快。

不要屏住呼吸;这个想法可能不是那么好。