gpt4 book ai didi

mysql - 缓慢的 MySQL IN 查询——如何转换为 JOIN?

转载 作者:可可西里 更新时间:2023-11-01 08:21:01 25 4
gpt4 key购买 nike

我目前的 MySQL 查询最多需要 10 秒才能在我的应用程序中运行:

SELECT tagid, tag FROM tags WHERE tagid IN 
(SELECT DISTINCT tagid FROM news_tags WHERE newsid IN
(SELECT newsid FROM news_tags WHERE tagid IN (16,32)
GROUP BY newsid HAVING COUNT(newsid)>=2))
AND tagid NOT IN (16,32) ORDER BY level, tagid

使用的表格是:

  • news_tags , 列 newsid , tagid
  • tags , 列 tagid , tag , level

查询的目的是查找带有 tagid 标记的“新闻”项目16 32,然后找到这些新闻条目也被标记的其他标签,目的是允许用户进一步缩小具有更具体标签组合的“新闻”条目。最终目标是抢到剩余的相关tagtagid来自 tags 的列表。

我已经尝试过不同的尝试,得到一个等价的 JOIN但未能选择所有剩余的 tagid s 在附加了提供的标签的新闻项目上。

这是我的 EXPLAIN SQL 结果,以防它们指出我遗漏的另一个缓慢原因:

id|select_type       |table    |type          |possible_keys|key    |key_len|ref |rows|Extra 1|PRIMARY           |tags     |range         |PRIMARY      |PRIMARY|      4|NULL|  55|Using where; Using filesort 2|DEPENDENT SUBQUERY|news_tags|index_subquery|tagid        |tagid  |      4|func|  26|Using index; Using where 3|DEPENDENT SUBQUERY|news_tags|index         |tagid        |PRIMARY|      8|NULL|  11|Using where; Using index

只是为了澄清问题:我想要同时标记 16 和 32 标签的新闻项目的剩余标签,而不是 16 或 32。抱歉造成任何混淆。

最佳答案

SELECT DISTINCT tags.tagid, tags.tag
FROM
tags -- tags from the ...
JOIN news_tags AS n0 USING (tagid) -- ... news items tagged with ...
JOIN news_tags AS n1 USING (newsid) -- ... tagid = 16 and ...
JOIN news_tags AS n2 USING (newsid) -- ... tagid = 32
WHERE
n1.tagid = 16 AND n2.tagid = 32
AND tags.tagid NOT IN (16,32) -- not the tags we already know about
ORDER BY tags.level, tags.tagid

关于mysql - 缓慢的 MySQL IN 查询——如何转换为 JOIN?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10387795/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com