提高mysql中的查询性能

时间:2013-04-09 04:08:44

标签: mysql join group-by

我使用了这个查询

SELECT  COUNT(CASE WHEN C <= 1 THEN 1 END) AS nooffamiliesHavingcount1,
        COUNT(CASE WHEN C BETWEEN 2 AND 4 THEN 1 END) AS nooffamiliesHavingcountbetween2And4,
        COUNT(CASE WHEN C > 4 THEN 1 END) AS nooffamiliesHavingcountgreaterthan3
FROM    (   SELECT  COUNT(*) AS C
            FROM    user where user_id = (select user_id from location where location_id in(select location_id from country where state_name='STATE'))
            GROUP BY House_No
        ) t
  

此处子查询返回大约10000条记录。用户   表有10,00,000条记录。这花了太多时间。然后   它说错误是服务器消失了。我正在使用mysql。

我是从谷歌搜索的。但对我来说没有运气。

我需要对我的表进行哪些更改。如何成功执行此查询    提高查询性能。请建议我。提前谢谢......

2 个答案:

答案 0 :(得分:2)

尝试此查询

SELECT 
  COUNT(CASE WHEN C <= 1 THEN 1 END) AS nooffamiliesHavingcount1,
  COUNT(CASE WHEN C BETWEEN 2 AND 4 THEN 1 END) AS nooffamiliesHavingcountbetween2And4,
  COUNT(CASE WHEN C > 4 THEN 1 END) AS nooffamiliesHavingcountgreaterthan3
FROM  
  (SELECT 
    COUNT(*) AS C
  FROM 
    user u,  
    location l, 
    country c 
  where 
    l.state_name='STATE' AND 
    l.some_other_column_id= 4 AND  <------- Add your condition
    c.location_id = l.location_id AND 
    u.user_id = l.user_id 
  GROUP BY 
    u.House_No) t

使用正确的连接,因为它很容易理解..

SELECT 
  COUNT(CASE WHEN C <= 1 THEN 1 END) AS nooffamiliesHavingcount1,
  COUNT(CASE WHEN C BETWEEN 2 AND 4 THEN 1 END) AS nooffamiliesHavingcountbetween2And4,
  COUNT(CASE WHEN C > 4 THEN 1 END) AS nooffamiliesHavingcountgreaterthan3
FROM  
  (SELECT 
    COUNT(*) AS C
  FROM 
    user u
  INNER JOIN  
    location l
  ON 
    l.state_name='STATE' AND 
    l.some_other_column_id= 4   <------- Add your condition
    u.user_id = l.user_id 
  INNER JOIN
    country c 
  ON 
    c.location_id = l.location_id 
  GROUP BY 
    u.House_No) t

<强> EDITED

在大多数情况下,JOIN比子查询更快,并且子查询的速度非常快。 我接受使用子查询更合乎逻辑且易于理解,但是当它涉及性能时,它不如连接那么好。 如果您正在使用连接,您的数据库将自行优化您的查询,这不是子查询的情况。 尝试对您的两个查询使用explain,您将清楚地了解查询的执行方式。

希望这会有所帮助......

答案 1 :(得分:1)

你可以尝试下面的内容:

SELECT COUNT(COUNT()&lt; = 1 THEN 1 END时的情况)AS nooffamiliesHavingcount1,         COUNT(在2和4之间计数()的情况下,然后结束2)作为nooffamiliesHavecount Between2And4,         COUNT(COUNT(*)&gt; 4结束时的情况)作为nooffamiliesHavingcountgreaterthan3 来自用户用户 内部联接 (从位置loc中选择user_id Inner Join country con 在loc.location_id = con.location_id,其中state_name ='STATE')为temp

在House_No

上的user.user_id = temp.user_id组