56

私は、大きくて複雑なMySQLデータベースの本質的にフレンドリーな読み取り専用フロントエンドであるプログラムの維持を支援しています-プログラムは、ユーザーの入力からアドホックSELECTクエリを構築し、クエリをDBに送信し、結果を取得します。それらを後処理し、ユーザーに適切に表示します。

構築されたクエリの期待されるパフォーマンスについて、何らかの形の合理的/ヒューリスティックな予測を追加したいと思います-ユーザーが不注意にクエリを実行すると、必然的に非常に長い時間がかかることがあります(膨大な結果セットが返されるため、またはDBのインデックス作成方法の「詳細に反する」)、クエリにかかる時間に関する「ある程度信頼できる」情報/推測をユーザーに表示できるようにしたいと思います。ユーザーがそれを無視することを学ぶ「泣き虫」効果を引き起こすほどひどく頻繁に現実との衝突から抜け出さない限り、それは完璧である必要はありません;-)この情報に基づいて、ユーザーは、コーヒーを飲みに行く(見積もりが5〜10分である場合)、昼食に行く(30〜60分である場合)、

MySQLのEXPLAINステートメントにあまり精通していません-クエリやDBのスキーマ、インデックス作成などを最適化するために使用する方法については多くの情報がありますが、より限定された目的で使用する方法についてはあまり詳しくありません--DBを与えられたものとして、単に予測を行います(もちろん、予測が十分に信頼できる場合は、最終的にはそれらを使用してクエリが取ることができる代替形式から選択するように切り替える可能性がありますが、それは将来のためです:今のところ、上記の目的のために、パフォーマンスの推測値をユーザーに示すだけで十分に満足しています)。

ポインタは...?

4

3 に答える 3

22

EXPLAINは、クエリにかかる時間を示しません。せいぜい、2つのクエリのどちらが速いかを推測するためにそれを使用できますが、そのうちの1つが明らかにひどく書かれていない限り、それでも非常に困難になります。

サブクエリを使用している場合は、EXPLAINの実行でさえ遅くなる可能性があることにも注意する必要があります(場合によってはクエリ自体とほぼ同じくらい遅くなります)。

私の知る限り、MySQLはクエリの実行にかかる時間を見積もる方法を提供していません。各クエリの実行にかかる時間をログに記録し、過去の同様のクエリの履歴に基づいて見積もりを作成できますか?

于 2009-04-25T19:10:24.237 に答える
11

これからかなり信頼できるものを構築するチャンスが欲しいのなら、あなたがすべきことは、テーブルサイズとクエリ処理時間に相関する分解されたEXPLAIN結果コンポーネントから統計モデルを構築することです。EXPLAINの内容について考えることに基づいてクエリ実行時間予測子を構築しようとすると、漠然とした有用性に洗練される前に、恥ずかしいほど貧弱な結果をもたらすのに時間がかかりすぎます。

于 2009-04-25T19:12:38.770 に答える