【问题标题】:Performance improvement for SQL count querySQL 计数查询的性能改进
【发布时间】:2013-05-21 09:31:17
【问题描述】:

我会用什么类型的sql查询来转下面的;

|  ID  |  SERIAL  |  LCN  | INITLCN |
|------|----------|-------|---------|
|  1   |    A     |  A1   |         |
|  2   |    B     |  A2   |         |
|  3   |    C     |  A3   |   A1    |
|  4   |    D     |  A4   |   A2    |
|  5   |    E     |  A5   |   A1    |
|------|----------|-------|---------|

变成类似这样的结果;

|  ID  |  COUNT  |
|------|---------|
|  1   |    2    |
|  2   |    1    |
|------|---------|

使用我的低 SQL 技能,我设法编写了以下查询,但是它非常慢;

select
  a.id,
  count (b.id) as parent
from assets a 
left join assets b
  ON (a.lcn = b.initlcn)
group by a.id
order by a.id;

【问题讨论】:

  • 由于and 存在,该查询甚至不应该运行
  • 首先使用 INNER JOIN,它只会返回匹配的结果,还会索引连接列,最后确保它们是 TEXT 或大 VARCHARS,尝试使用 ids
  • and 已删除。标题已更新以反映实际问题。
  • @We0 - INNER JOIN 将执行时间从 ~28s 减少到 ~1s。谢谢!
  • 你也可以看这里:stackoverflow.com/a/457274/2319383

标签: mysql sql join


【解决方案1】:
select
t1.ID,
t1.LCN,
COUNT(*)
from
Table1 t1
INNER JOIN Table1 t2 ON t1.LCN = t2.INITLCN
GROUP BY t1.LCN

查看它在sqlfiddle 中的实时工作。

【讨论】:

    【解决方案2】:

    也许两个表连接不是 nesecerry 。 试试这个

    select 
    a.id
    ,b.cnt
    from assets a
    join (
     select 
     initlcn
     count(1) cnt
     from assets
     group by initlcn
    )
    b on (a.lcn=b.initlcn)
    

    【讨论】:

    • 你加入了稀薄的空气还是什么? :)
    【解决方案3】:

    您也可以测试以下查询 -

    我已经检查了您发布的查询和以下查询的执行计划,我发现两者之间有很好的区别 -

    SELECT t_1.Id, t_2.Cnt
      FROM Assets t_1,
           (SELECT Initlcn, COUNT(*) Cnt FROM Assets GROUP BY Initlcn) t_2
     WHERE t_1.Lcn = t_2.Initlcn
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-05-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-02-13
      • 1970-01-01
      相关资源
      最近更新 更多