ICode9

精准搜索请尝试: 精确搜索
首页 > 数据库> 文章详细

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

2019-12-01 11:16:03  阅读:200  来源: 互联网

标签:join sql mysql database


当前,我当前的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

标签:join,sql,mysql,database
来源: https://codeday.me/bug/20191201/2080471.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有