优化SQL查询以进行标记匹配

时间:2012-10-08 13:31:32

标签: mysql sql optimization query-optimization sql-optimization

示例数据集:

id | tag
---|------
1  | car
1  | bike
2  | boat
2  | bike
3  | plane
3  | car

idtag都已编入索引。

我正在尝试获取与标签[汽车,自行车]相匹配的ID(标签数量可能会有所不同)。

这样做的天真查询是:

SELECT id
FROM test
WHERE tag = 'car'
    OR tag =  'bike'
GROUP BY id
HAVING COUNT(*) = 2

然而,这样做是非常低效的,因为分组和事实是任何匹配一个标签的线都被考虑到(并且我有一个大的体积)。

这种情况是否有更高效的查询?

我看到的唯一解决方案是让另一个表包含以下内容:

id | hash
---|------
1  | car,bike
2  | boat,bike
3  | plane,car

但这不是一个易于实施和维持最新的解决方案。

其他信息:

  • 名称匹配必须准确(无全文索引)
  • 标签数量并不总是2

3 个答案:

答案 0 :(得分:0)

试试这个:

SELECT id
FROM test
WHERE tag in('car','bike')
GROUP BY id
HAVING COUNT(*) = 2

在标记列

上创建非聚簇索引

答案 1 :(得分:0)

你走了:

select id from TEST where tag = 'car' and ID in (select id from TEST where tag='bike')

答案 2 :(得分:-1)

不确定我是否得到你,但试试这个:

select tag, count(*)  as amount
into #temp
from MYTABLE
group by tag


select t1.tag 
from #temp t1 join #temp t2 on t1.amount=t2.amount and t1.tag=t2.tag and t1.amount=2

应该导致自行车和汽车,因为它们都有2行,等于2