通过联接表的MySQL INTERSECT?
|
因此,从本质上讲,我有两个表,其中包含URLS和TAGS,并且通过联接表TAGS_URLS在两个表之间具有“拥有且属于多个”关系。
通过标签查找URL的简单查询为:
SELECT urls.id FROM urls
INNER JOIN tags_urls ON urls.id=tags_urls.url_id
INNER JOIN tags ON tags_urls.tag_id=tags.id
WHERE tags.tag IN (\"sample\",\"tag\",\"list\");
但是,我正在尝试恢复包含一组标记的所有URL的交集。即,仅包含标签\“ sample \” AND \“ tag \” AND \“ list \”的URL \。
我有一个有效的查询,但无法在30秒内执行查询。
SELECT a.id
FROM
(SELECT DISTINCT urls.id FROM urls
INNER JOIN tags_urls ON tags_urls.url_id=urls.id INNER JOIN tags ON tags.id=tags_urls.tag_id
WHERE tags.tag = \'sample\') a
JOIN
(SELECT DISTINCT urls.id FROM urls
INNER JOIN tags_urls ON tags_urls.url_id=urls.id INNER JOIN tags ON tags.id=tags_urls.tag_id
WHERE tags.tag = \'list\') b
ON a.id = b.id;
结果集是正确的,但性能令人震惊。
我目前也确实在Redis数据库中复制了数据,并将它们作为URL ID的列表存储在标记集中,因此我可以执行类似的操作并很快获得结果集。
SINTER \"tag-sample\" \"tag-list\"
是否可以通过合理的努力通过SINTER将用于此任务的MySQL性能提升到Redis级别?
没有找到相关结果
已邀请:
2 个回复
糖固傻染
您将继续为要与之相交的每个\'tag \'添加成对的内部联接到tag_urls和tag。再次,通过explain运行,并确保所有内容都具有正确的索引。 DBMS可以很好地使用多个内部联接,但是随着交叉点数量的增加,性能会下降。
踩什不