2011-06-30 5 views
0

私は地理的にイベントをリストアップしているデータベースを持っています(現在はデータベース内の100000件近くのイベント)。テーブルteventのイベントには、外部キーがあり、テーブルtvenueの外部キーがfkcityであり、続きtregiontcountryのイベントが発生しています。ほとんどのイベントで国を見つけるため最も速いクエリ応答のために複数のテーブル構造を選択する方法

クエリは劣らず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倍を取りました複雑なクエリ。

誰かがこれを説明したり、マルチテーブルクエリの速度を理解するのに役立つ優れたリソースを教えてもらえますか?あるいは、私にこのようなことのための好ましいパターンを教えてください?

(誰もが尋ねる前に、私はタイミング結果が有効にするために実行間の「リセットクエリキャッシュ」を行うために世話をしてきました、はい、私はきちんとすべてをインデックス化している!!!!)

ありがとう

デビット

答えて

0

あなたはMySQLがどのようにクエリを評価しているかを調べる必要があります。これを行うには、組み込みコマンドEXPLAINを使用します。このコマンドは、MySQLが与えられたselect文を実行する方法を記述します。あなたはとても上のどのインデックスとそれが使用する結合、および含めて、MySQLの「クエリ実行プラン」を参照してくださいするのEXPLAIN出力を使用することができますhttp://dev.mysql.com/doc/refman/5.5/en/explain.html

:ここ

はEXPLAINのリファレンスです。これにより、特定のクエリが高速または低速である理由と、そのクエリを改善するためにできることを解釈できます。通常、これは特定のインデックスを追加すること、またはクエリを使用するために調整することを意味します。

この強力なツールを使用する際には、Googleの「MySQL EXPLAIN」に多数のガイドがあります。このようなウォークスルーがあります:http://forums.spry.com/howtos/1345-using-mysqls-explain-command.html

関連する問題