【问题标题】:increase query performance in mysql提高mysql中的查询性能
【发布时间】:2013-04-09 04:08:44
【问题描述】:

我用过这个查询

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。

我从谷歌搜索。但我没有运气。

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

【问题讨论】:

  • 您需要向我们展示表和索引定义。 诊断慢查询需要完整的表和索引定义,而不仅仅是描述或解释。也许您的表格定义不佳。也许索引没有正确创建。也许您认为您在该列上没有索引。没有看到表和索引定义,我们无法判断。如果您知道如何进行EXPLAIN 或获得执行计划,请将结果也放入问题中。
  • 我们需要查看整个查询。仅仅解释“这里是另一个子查询”是不够的。向我们展示整个代码、所有表定义和所有索引定义。
  • 有什么办法适合我

标签: mysql join group-by


【解决方案1】:

试试这个查询

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

已编辑

在大多数情况下,JOIN 比子查询更快,而且子查询更快的情况很少见。 我接受使用子查询更合乎逻辑且易于理解,但是在性能方面它不如连接好。 如果您使用连接,您的数据库将自行优化您的查询,这不是子查询的情况。 尝试对两个查询都使用 explain,您将清楚地了解查询是如何执行的。

希望这会有所帮助...

【讨论】:

  • 我和你使用的查询有什么区别。请解释一下
  • 你是用joins替换子查询。子查询和joins有什么区别
  • 应该从一开始就添加解释...检查编辑..希望它有帮助...
  • 我还有一个问题。你现在可以帮我吗
  • 实际上我的子查询的条件基于 id 而不是 name
【解决方案2】:

你可以试试下面的:

SELECT COUNT(CASE WHEN COUNT() ) BETWEEN 2 AND 4 THEN 1 END) AS nooffamiliesHavingcountbetween2And4, 计数(CASE WHEN COUNT(*) > 4 THEN 1 END)作为 nooffamiliesHavingcountgreaterthan3 FROM 用户用户 内部联接 (从位置 loc 中选择 user_id 内部连接国家con on loc.location_id =con.location_id where state_name='STATE' )as temp

关于 user.user_id =temp.user_id 组 by House_No

【讨论】:

  • 为你+1。它对我也很有用。但是需要一些时间来理解。
  • 实际上我在子查询中发布了一些代码,这与我所拥有的有点不同。所以我有些困惑
猜你喜欢
  • 2011-12-03
  • 2023-04-08
  • 2016-08-18
  • 2023-03-14
  • 1970-01-01
  • 1970-01-01
  • 2013-03-21
  • 2019-09-16
  • 1970-01-01
相关资源
最近更新 更多