繁体   English   中英

提高mysql中的查询性能

[英]increase query performance in mysql

我使用过这个查询

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。

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

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

试试这个查询

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,您将清楚地了解查询是如何执行的。

希望这可以帮助...

你能尝试下面的:

SELECT COUNT(当COUNT( )<= 1那么1结束时的情况)作为nooffamiliesHavingcount1,COUNT(在 2和4之间COUNT( )的情况下1结束)作为nooffamiliesHavingcount Between2And4,COUNT(COE(*)> 4那么结束时的情况) AS nooffamiliesHavingcountgreaterthan3 FROM用户用户内部联接(从loc loc选择user_id,在loc.location_id = con.location_id,其中state_name ='STATE')

在House_No上的user.user_id = temp.user_id组中

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM