2017-09-26 38 views
0

我有以下各表數據庫:MySQL查詢非常通過對組慢和計數

醫院(〜28K行), 檢查(〜116K行), 問題(〜290K行)

醫院有檢查,每次檢查有零或多個問題。我有以下查詢:

SELECT count(*) as count, BName, BCity, BAddress, BState, BZip, Ins_date, BCountry, Ins_Type 
FROM (SELECT b.id as ID, b.hospital_name as BName, b.city as BCity, b.address as BAddress, b.country as BCountry, b.state as BState, b.zip as 
BPostal, i.date as Ins_date, v.type as Ins_Type 
FROM hospital_table b, inspection_table i, issue_table v 
WHERE b.id = i.business_id 
    AND i.id = v.inspection_id 
    ORDER BY b.hospital_name, i.date DESC) AS sumissues 
GROUP BY ID 
ORDER BY count DESC; 

我希望和得到的輸出是:

112 | Burnaby Memorial | Burnaby | 3935 Kincaid St | BC | 2017-07-19 | Canada | Cleanliness 

問題是,它需要大約40秒運行。我有一個外鍵索引,和inspection_table.date。關於如何優化這個的任何想法?

+1

爲什麼要在內部查詢中命令'ORDER BY b.hospital_name,i.date DESC' ??我認爲這是不必要的。只需將其刪除並再次嘗試。 –

+0

你想要算什麼?然後每天檢查一次?每家醫院的問題數量?還有別的嗎?你預計每家醫院有一行作爲輸出嗎?你的問題是足夠詳細的,以提供狡猾的答案。 –

+0

你可以運行解釋與您的查詢和發佈結果,這將有助於提供更好的答案。 https://dev.mysql.com/doc/refman/5.7/en/explain.html – Aknosis

回答

0

展望代碼

在子查詢不需要,也沒有必要

SELECT 
    count(*) as count 
    , b.hospital_name as BName 
    , b.city as BCity 
    , b.address as BAddress 
    , b.country as BCountry 
    , b.state as BState 
    , b.zip as BPostal 
    , i.date as Ins_date 
    , v.type as Ins_Type 
FROM hospital_table b 
INNER JOIN inspection_table i ON b.id = i.business_id 
INNER JOIN issue_table v ON i.id = v.inspection_id 
GROUP BY b.id 
ORDER BY count DESC, b.hospital_name, i.date 

子選擇,但也要小心進行什麼commente通過@User_by_Already

,這和順序如果你不關心這些列的結果,你可以使用(假)聚合函數

SELECT 
    count(*) as count 
    , b.hospital_name as BName 
    , b.city as BCity 
    , b.address as BAddress 
    , b.country as BCountry 
    , b.state as BState 
    , b.zip as BPostal 
    , min(i.date) as Ins_date 
    , min(v.type) as Ins_Type 
FROM hospital_table b 
INNER JOIN inspection_table i ON b.id = i.business_id 
INNER JOIN issue_table v ON i.id = v.inspection_id 
GROUP BY b.id 
ORDER BY count DESC, b.hospital_name, i.date 
+0

僅由一列進行分組,但輸出比這更多的數據,可能適用於舊版本的MySQL,但這總是不好的做法。介紹列i.date和v.vtype應該產生多個行b.id –

+0

@Used_By_Already正確我更新與此..但yoru評論si更快.. – scaisEdge

+0

。回答更新爲組和列的暗示 – scaisEdge