2017-09-26 41 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