mysql - 使用 "in"慢速连接和子查询的 SQL 嵌套集查询

标签 mysql sql nested-sets nested-set-model

我在查询嵌套集合结构时遇到一些问题,该结构很慢(~4 秒)

select node.ID, node.Lft, node.Rgt, node.Level, count(ag.ArticleID) as count
from Webshop.Category node
left join Webshop.Category parent on parent.Lft between node.Lft and node.Rgt
left join Webshop.ArticleGroup ag on parent.GroupID = ag.GroupID
    and ag.ArticleID in (
        select a.ID
        from Webshop.Article a
        join Webshop.ArticleOwner ao on ao.ArticleID = a.ID and ao.OWNRID = 1
        join Webshop.ArticleAssortment aa on aa.ArticleID = a.ID and aa.AssortmentID = 6
    )
group by node.ID
having count > 0

解释返回以下内容:

id,select_type,table,type,possible_keys,key,key_len,ref,rows,Extra
1,PRIMARY,node,ALL,NULL,NULL,NULL,NULL,2538,"Using temporary; Using filesort"
1,PRIMARY,parent,ALL,Lft,NULL,NULL,NULL,2538,
1,PRIMARY,ag,ref,fk_ArticleGroup_Group1_idx,fk_ArticleGroup_Group1_idx,4,Webshop.parent.GroupID,9,"Using index"
2,"DEPENDENT SUBQUERY",a,eq_ref,PRIMARY,PRIMARY,4,func,1,"Using index"
2,"DEPENDENT     SUBQUERY",ao,eq_ref,"ArticleIDOWNRID,fk_ArticleOwner_Article1_idx,fk_ArticleOwner_OWNR1_idx",ArticleI    DOWNRID,8,"Webshop.a.ID,const",1,"Using index"
2,"DEPENDENT SUBQUERY",aa,eq_ref,"PRIMARY,fk_ArticleAssortment_Article1_idx",PRIMARY,8,"Webshop.a.ID,const",1,"Using index"

我认为使用 in() 的子查询会使查询变慢。有更好的方法吗?

谢谢。

编辑:

我忘记从子查询的连接中删除 left

最佳答案

您可以尝试JOINing:

select node.ID, node.Lft, node.Rgt, node.Level, count(ag.ArticleID) as count
from Webshop.Category node
left join Webshop.Category parent on parent.Lft between node.Lft and node.Rgt
left join Webshop.ArticleGroup ag on parent.GroupID = ag.GroupID
        join (
        select a.ID as `id`
        from Webshop.Article a
        left join Webshop.ArticleOwner ao on ao.ArticleID = a.ID and ao.OWNRID = 1
        left join Webshop.ArticleAssortment aa on aa.ArticleID = a.ID and aa.AssortmentID = 6
    ) in_ids on ag.ArticleID = in_ids.id
group by node.ID
having count > 0

关于mysql - 使用 "in"慢速连接和子查询的 SQL 嵌套集查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25742535/

相关文章:

mysql - Mojolicious 数据库插件 - 帮助程序错误

sql - 为快速临时查询构建 100M 记录表的好方法是什么?

database - 允许一个类别有多个父类有意义吗?有其他选择吗?

mysql - Mariadb - 从用户 ID = 变量的所有消息列表中获取最新消息

mysql - 将SQL结果分配给MySQL中准备好的语句的变量

mysql - MySQL 中何时使用单引号、双引号和反引号

mysql - 如何在这个简单的查询中避免文件排序? (没有加入)

php - 如何在 joomla 2.5 中创建 joomla 用户组

ruby-on-rails - 如何显示关联记录子集的表单,其中一些尚不存在?

mysql - ERROR 2006 (HY000) : MySQL server has gone away - Broken db, 表或 mysql 坏了?