私は、地理ごとにイベントをリストしているデータベースを持っています (現在、データベースには約 100000 のイベントがあります)。現時点では、適切に正規化されたスキーマにあります。テーブル内のイベントにtevent
は、外部キーを持つfkvenue
テーブル内の会場を指す外部キーがあります。tvenue
fkcity
tregion
tcountry
したがって、イベントが最も多い国を見つけるためのクエリはかなり複雑で、内部結合が 3 つ以上あります。
select r.fkcountry,count(distinct e.id) from tevent e
inner join tvenue v on e.fkvenue=v.id
inner join tcity cy on v.fkcity=cy.id
inner join tregion r on cy.fkregion=r.id
group by r.fkcountry order by count(distinct e.id) desc
私は物事をスピードアップする方法を見つけようとしています.国ごとにイベントを直接マッピングすると役立つかもしれないと思いました. teventcountry
次のはるかに単純な結果の構文を使用して、マップ テーブルを作成しました。
select ec.fkcountry,count(distinct e.id) from tevent e inner join teventcountry ec on ec.fkevent=e.id group by ec.fkcountry order by count(distinct e.id) desc
驚いたことに、これは正反対の効果をもたらしました。新しいクエリは、以前のはるかに複雑なクエリの約 5 倍の時間がかかりました。
誰かがこれを説明してくれますか、またはマルチテーブルクエリの速度を理解するのに役立つ良いリソースを教えてくれますか? または、この種の好ましいパターンを教えてください。
(だれかが尋ねる前に、タイミングの結果を有効にするために、実行の合間に「クエリ キャッシュのリセット」を行うように注意しました。はい、すべてを適切にインデックス化しました!!!!)
ありがとう
デビッド