2017-09-26 17 views
0

を数え、私は次のテーブルを持つデータベースがあります。によってグループにMySQLのクエリが非常に遅く、

病院(〜28K行)、 検査(〜116K行)、 問題(〜290K行)

病院には検査があり、検査には0件以上の問題があります。私は、次のクエリを持っている:私は期待し得る

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 

問題は、それが実行に40secondsほどかかります。私は外部キーとinspection_table.dateのインデックスを持っています。どのように私はこれを最適化することができますか?あなたのコード

に副選択が

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 

を必要しかし、このために@User_by_Already

によってcommenteに何のために気をつけていません必要ない副選択でも順を探し

+1

なぜ内側のクエリでオーダするのですか?ORDER BY b.hospital_name、i.date DESC' ??私はこれが不要だと思う。ただそれを取り出してもう一度試してみてください。 –

+0

何を数えようとしていますか? 1日あたりの検査はいつもですか?病院あたりの問題の数は?他に何か?病院ごとに1つの列が出力として期待されますか?あなたの質問は、厳密な答えを提供するのに十分詳細です。 –

+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 
    , 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

1つの列だけをグループ化してもそれより多くを出力することは、古いバージョンのMySQLでは機能するかもしれませんが、常に悪い習慣です。列の導入i.dateとv.vtypeは、b.idごとに複数の行を生成する必要があります。 –

+0

@Used_By_すでに正しいです。これでも更新していますが、より早くコメントすることができます。 – scaisEdge

+0

。グループごとにsuggetionで更新されました。 – scaisEdge

関連する問題