所以本质上我有两个表,包含 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”和“tag”和“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 的水平?