古い vb.net Web アプリを古いサーバーから新しいサーバーに移動する必要があるクライアントがいます。新しいサーバーでアプリを実行すると、サーバーが新しく、ハードウェアがはるかに優れているにもかかわらず、実行速度が非常に遅いことに気付きました。
アプリケーションのパフォーマンス分析を実行したところ、主要なホットスポットは OdbcDataAdapter.Fill() コマンドでした。
次に、MySQL で一般ログを有効にして、それを追跡しました。私が見つけたのは、アプリが大量のクエリを作成していたことです (たとえば、このプログラマーは検索結果ごとに複数のクエリを実行していました) が、どこかで抑制されているようです。
以下は、1 つのページ リクエストのログのほんの一部です。
130223 11:21:48 624 Connect root@localhost on mydb
624 Query SET NAMES utf8
624 Query SET character_set_results = NULL
624 Query SET SQL_AUTO_IS_NULL = 0
624 Query set @@sql_select_limit=DEFAULT
624 Query select count(*) from bg_doc_status where uploaded = 1 and candidateid='51233'
624 Quit
130223 11:21:49 625 Connect root@localhost on mydb
625 Query SET NAMES utf8
625 Query SET character_set_results = NULL
625 Query SET SQL_AUTO_IS_NULL = 0
625 Query set @@sql_select_limit=DEFAULT
625 Query select * from bg_doc_status where willfax=1 and candidateid='51233'
625 Quit
130223 11:21:50 626 Connect root@localhost on mydb
626 Query SET NAMES utf8
626 Query SET character_set_results = NULL
626 Query SET SQL_AUTO_IS_NULL = 0
626 Query set @@sql_select_limit=DEFAULT
626 Query Select distinct serviceid from bg_service_results where CandidateID='51233'
626 Quit
130223 11:21:51 627 Connect root@localhost on mydb
627 Query SET NAMES utf8
627 Query SET character_set_results = NULL
627 Query SET SQL_AUTO_IS_NULL = 0
627 Query set @@sql_select_limit=DEFAULT
627 Query Select count(*) from bg_candidates_selected_services where CandidateID='51233'
627 Quit
このプログラミングがどれほど悪いかについて話す必要はありません:)。この男は、1 つのクエリで多くのことを行っている可能性があります。それでも、MySql は 1 秒あたり最大 1 つのクエリを実行するようです!
ワークベンチの SQL エディターでこれらのクエリを実行すると、それぞれ「0.000 秒」かかります。CTRL + ENTER をできるだけ早く押すと、1 秒間に数回実行されることがログに記録されます。
この 1 秒あたり 1 クエリの制限の原因を知っている人はいますか? 開発と本番の両方で発生します。
32 ビットと 64 ビットの両方で、MySQL ODBC 5.2w ドライバーと MySQL ODBC 5.2a ドライバーの両方を試しました。
私は解決策を見つけました: odbc.open() は丸1秒かかっていたものです。どうやら、時間がかかっていたのは dns ルックアップ (localhost の場合!) でした。web.config の db サーバー アドレスを 127.0.0.1 に変更すると、修正されました。この人が同じ問題を見つけたようです。