小编Ste*_* C.的帖子

MySQL INTERSECT通过连接表?

所以基本上我有两个表,包含URL和TAGS,通过连接表TAGS_URLS在两者之间具有has-and-belongs-to-many关系.

通过标记查找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");
Run Code Online (Sandbox Code Playgroud)

但是,我正在尝试恢复包含所有一组标记的所有URL的交集.即,只有包含标签"sample"和"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;
Run Code Online (Sandbox Code Playgroud)

结果集是正确的,但性能可怕.

我目前还在Redis数据库中将数据复制为存储在标记集中的URL ID列表,这样我就可以做到这样的事情并很快得到结果集.

SINTER "tag-sample" "tag-list"
Run Code Online (Sandbox Code Playgroud)

通过合理的努力,是否有可能通过SINTER将此任务的MySQL性能提升到Redis级别?

mysql has-and-belongs-to-many intersect

5
推荐指数
1
解决办法
2135
查看次数

标签 统计

has-and-belongs-to-many ×1

intersect ×1

mysql ×1