繁体   English   中英

MySQL Group运行太慢

[英]MySQL Group running too slow

我有3个MySQL表,我需要从中获取结果,这些表是:

1. Towns
Fields Towncode and Townname

2. Students
Fields student_id,name,surname,address,streetcode,towncode,HeadOfFamily

3. Phonebank
Fields student_id,contacted,towncode

现在,我需要一个mysql语句(a)从“学生”表中获取家庭总数,以及(b)为该特定城镇联系的学生数。

到步骤(a)为止,我已经管理了哪个,并且速度非常快:

SELECT 
      t.towncode as towncode, 
      t.townname as townname, 
      (SELECT COUNT(*) 
          FROM students p 
          WHERE p.towncode=t.towncode 
            and p.student_hh='H') AS households
   FROM 
      towns t 
   ORDER BY 
      t.towncode ASC 

但我无法设法插入另一个“ SELECT STATEMENT”来获取该特定城镇的电话数量。

你能帮忙吗?

对城镇进行单项记录可能会伤害您。 我会先查询学生表,然后再使用连接到城镇的表。

对于索引,我将具有以下索引

table      index
towns      ( towncode, townname )
students   ( student_hh, towncode )

SELECT 
      t.towncode as towncode, 
      t.townname as townname, 
      TownCnts.households
   FROM 
      towns t 
         JOIN ( SELECT 
                      p.towncode,
                      COUNT(*) households
                   from
                      students p
                   where
                      p.student_hh = 'H'
                   group by 
                      p.towncode ) as TownCnts
           ON t.towncode = TownCnts.towncode
   ORDER BY 
      t.towncode ASC 

假设“呼叫”数是PhoneBank表中具有特定城镇代码的行数,则可以添加另一个子选择:

SELECT t.towncode as towncode, t.townname as townname, 
       (SELECT COUNT(*) 
        FROM students p 
        WHERE p.towncode = t.towncode and p.student_hh='H'
       ) AS households,
       (SELECT COUNT(*) 
        FROM phonebank pb
        WHERE pb.towncode = t.towncode 
       ) AS calls
FROM towns t 
ORDER BY t.towncode ASC ;

您的问题有点含糊。 您可能希望在第二个查询中使用count(distinct studentid) ,而不是count(*)

要优化此查询,请创建以下索引:

  • 城镇(区号)
  • 学生(区号,student_hh)
  • 电话银行(区号)

暂无
暂无

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

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