0

次のクエリを実行すると、速度が遅くなります (~6 秒)。

SELECT sql_no_cache
    t1.id, t2.id, count(injury.id)
FROM age_group as t1
CROSS JOIN body_part as t2
LEFT JOIN injury 
     ON t1.id = injury.age_group_id 
     AND t2.id = injury.body_part_id
GROUP BY t1.id,t2.id

を削除すると、GROUP BYすぐに実行されます。

私が使用するときEXPLAINの唯一の違いは、GROUP BY「インデックスの使用、一時的な使用、ファイルソートの使用」がリストされていることです。

私はこれを回避する方法について途方に暮れています。

傷害テーブルの任意のフィールドをグループ化できるようにする必要があったため、すべての組み合わせにインデックスを付けるのは適切な解決策ではない可能性があります。

何か案は?

4

1 に答える 1

0

結合なしで集計を行うことができます。

select injury.age_group_id, injury.body_part_id, count(*)
from injury
group by injury.age_group_id, injury.body_part_id

これは、損傷がある場合にのみ結果を返します。

これがうまく機能する場合は、後で結合を行います。

select t.id, t2.id, coalesce(injury.cnt, 0)
from age_group as t1 CROSS JOIN
     body_part as t2 left outer join
     (select injury.age_group_id, injury.body_part_id, count(*) as cnt
      from injury
      group by injury.age_group_id, injury.body_part_id
     ) injury LEFT JOIN
     injury ON t1.id = injury.age_group_id and t2.id = injury.body_part_id
于 2013-06-04T01:48:20.367 に答える