缓慢的MySQL IN查询-如何转换为JOIN?
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了缓慢的MySQL IN查询-如何转换为JOIN?,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含1717字,纯文字阅读大概需要3分钟。
内容图文
![缓慢的MySQL IN查询-如何转换为JOIN?](/upload/InfoBanner/zyjiaocheng/881/a323101a90f746f99412c928606ba57b.jpg)
当前,我当前的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
>表格标签,带有列tagid,标签,级别
该查询的目的是查找已用标签ID为16和32标记的“新闻”项目,然后查找也已对这些新闻项目进行了标记的其他标签,目的是允许用户进一步缩小“新闻”项目与更具体的标签组合.最终目标是从标签表中获取其余相关的标签和tagid列.
我曾尝试过在等效的JOIN上进行不同的尝试,但是未能在新闻项上选择所有剩余的tagid,这些新闻项已附加了所提供的标签.
这是我的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 IN查询-如何转换为JOIN?全部内容,希望文章能够帮你解决缓慢的MySQL IN查询-如何转换为JOIN?所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。