0

私は、地理ごとにイベントをリストしているデータベースを持っています (現在、データベースには約 100000 のイベントがあります)。現時点では、適切に正規化されたスキーマにあります。テーブル内のイベントにteventは、外部キーを持つfkvenueテーブル内の会場を指す外部キーがあります。tvenuefkcitytregiontcountry

したがって、イベントが最も多い国を見つけるためのクエリはかなり複雑で、内部結合が 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 倍の時間がかかりました。

誰かがこれを説明してくれますか、またはマルチテーブルクエリの速度を理解するのに役立つ良いリソースを教えてくれますか? または、この種の好ましいパターンを教えてください。

(だれかが尋ねる前に、タイミングの結果を有効にするために、実行の合間に「クエリ キャッシュのリセット」を行うように注意しました。はい、すべてを適切にインデックス化しました!!!!)

ありがとう

デビッド

4

1 に答える 1

0

MySQLがクエリをどのように評価しているかを確認する必要があります。これを行うには、EXPLAINMySQLが特定のselectステートメントを実行する方法を説明する組み込みコマンドを使用します。

EXPLAINに関するリファレンスは次のとおりです:http://dev.mysql.com/doc/refman/5.5/en/explain.html

EXPLAINの出力を使用して、MySQLの「クエリ実行プラン」を確認できます。これには、使用するインデックスと結合などが含まれます。これから、特定のクエリが高速または低速である理由と、それを改善するために何ができるかを解釈できます。通常、これは特定のインデックスを追加するか、クエリで使用できるようにインデックスを微調整することを意味します。

この強力なツールの使用に関する一連のガイドについては、Googleの「MySQLEXPLAIN」を参照してください。そのようなウォークスルーの1つを次に示します。http://forums.spry.com/howtos/1345-using-mysqls-explain-command.html

于 2011-06-30T19:02:13.830 に答える