2011-05-06 71 views
1

不知道这是可能的,但如果是,就会使我的查询速度要快得多。传递结果从一个子查询的IN子句中的另一个子查询在MySQL

基本上我有这样的查询:

SELECT * 
    FROM (SELECT bar.id 
      FROM pivot_table 
      WHERE foo.id = x) t1 
    JOIN (SELECT count(*) c1, bar.id 
      FROM table 
     GROUP BY bar.id) t2 ON t1.id = t2.id 
    JOIN (SELECT count(*) c2, bar.id 
      FROM another_table 
     GROUP BY bar.id) t3 ON t1.id = t3.id 

但是,这是相当缓慢的,因为tableanother_table是巨大的。但实际上,我只对t1中的查询产生的值感兴趣。因此,如果我能以某种方式将这些结果纳入t2t3IN子句中,查询应该显着加快。

这可能吗?


不太清楚我猜。好的我在想的是将查询改为类似于:

SELECT * 
    FROM (GROUP_CONCAT (bar.id) as results 
       FROM pivot_table 
       WHERE foo.id = x) t1 
     JOIN (SELECT count(*) c1, bar.id 
       FROM table 
       WHERE bar.id IN (*results from t1*) 
       GROUP BY bar.id) t2 ON t1.id = t2.id 
     JOIN (SELECT count(*) c2, bar.id 
       FROM another_table 
       WHERE bar.id IN (*results from t1*) 
       GROUP BY bar.id) t3 ON t1.id = t3.id 

可能会更快,因为它缩小了在t2和t3中扫描的行数。情况不是这样吗?


每个人都希望看到它,所以这里是完整的查询:

SELECT (k_group.count/jk_group.count) * (s_group.count/jk_group.count) AS ratio, 
     jk_group.k_id               , 
     jk_group.s_id 
FROM 
     -- find the keywords for the job 
     (SELECT jk.keyowrd_id AS k_id 
     FROM jobs_keywords jk 
     WHERE job_id = 50100 
     ) 
     extracted_keywords 
     -- calculate the necessary values using group_by functions 
     INNER JOIN 
        (SELECT COUNT(*) count, 
          skill_id AS s_id , 
          keyword_id AS k_id 
        FROM  jobs_keywords jk 
          JOIN jobs_skills js 
          ON  js.job_id = jk.job_id 
          JOIN job_feed_details d 
          ON  d.job_id = js.job_id 
        WHERE d.moderated  = 1 
        GROUP BY skill_id, 
          keyword_id 
       ) 
        jk_group 
     ON  extracted_keywords.k_id = jk_group.k_id 
     INNER JOIN 
        (SELECT COUNT(*)  count, 
          keyword_id AS k_id 
        FROM  jobs_keywords jk 
          JOIN job_feed_details d 
          ON  d.job_id = js.job_id 
        WHERE d.moderated  = 1 
        GROUP BY keyword_id 
       ) 
        k_group 
     ON  jk_group.k_id = k_group.k_id 
     INNER JOIN 
        (SELECT COUNT(*) count, 
          skill_id AS s_id 
        FROM  jobs_skills js 
          JOIN job_feed_details d 
          ON  d.job_id = js.job_id 
        WHERE d.moderated  = 1 
        GROUP BY skill_id 
       ) 
        s_group 
     ON  jk_group.s_id = s_group.s_id 
ORDER BY ratio DESC 
LIMIT 25 
+1

没了感觉 - 为什么使用聚合函数(COUNT),如果你只是想检查支承台的ID的存在?很多错别字,顺便说一句,也是。请张贴您想要的列(以及它们来自的表格)作为最终结果。 – 2011-05-06 18:14:20

+0

您的第二个查询与第一个查询几乎相同,但Group_Concat除外。您可以通过修改查询来帮助我们,以便他们进行编译。例如,T1派生表中的'foo.id'和'bar.id'将不起作用。此外,当你在后面的子查询中使用'bar.id'时,它不会帮助我们。 – Thomas 2011-05-06 18:42:24

+0

job_id,keyword_id'在job_keywords中是唯一的吗? Job_skills中的'job_id,skill_id'是唯一的吗? – Thomas 2011-05-06 20:00:53

回答

1

我能做到什么,我试图做像这样:

SELECT * 
    FROM (@var:=GROUP_CONCAT(bar.id) as results 
       FROM pivot_table 
       WHERE foo.id = x) t1 
     JOIN (SELECT count(*) c1, bar.id 
       FROM table 
       WHERE bar.id IN (@var) 
       GROUP BY bar.id) t2 ON t1.id = t2.id 
     JOIN (SELECT count(*) c2, bar.id 
       FROM another_table 
       WHERE bar.id IN (@var) 
       GROUP BY bar.id) t3 ON t1.id = t3.id 

但在速度方面的优势不是太显著。我现在已经放弃了一种查询方法,以支持许多较小的查询,而且这样更好。

0

修订给出实际的查询

我想你可以消减查询到:

Select jk.Count(Distinct jk.keyword_id) 
     * jk.Count(Distinct js.skill_id) 
     /Power(Count(*), 2) 
     As ratio 
    , js.skill_id 
    , jk.keyword_id 
From jobs_keywords As jk 
    Join jobs_skills As js 
     On js.job_id = jk.job_id 
Where jk.job_id =50100 
Group By js.skill_id, jk.keyword_id 
Order By ratio Desc 
Limit 25 
1
SELECT COUNT(t1.id) c1, COUNT(t2.id) c2, COUNT(t3.id) c3, t1.id 
FROM pivot_table t1 
JOIN table t2 ON t1.id=t2.id 
JOIN another_table t3 ON t3.id=t1.id where t1.id=x group by t1.id 

请确保pivot_table.id,table.id和another_table.id被索引

有关查询: 查询的问题是driverd表使用加入缓冲液,让你的查询速度快,你应该增加你的加入缓冲区大小