簡體   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