MySQLサーバーをテストサーバーと本番サーバーの2つの異なるマシンにインストールしました。どちらもWindowsであり、ウェブアプリケーションで使用されます。
問題は、いくつかのクエリを実行すると、2つのマシン間でパフォーマンスが大幅に異なることです(本番サーバーの方が低速です)。両方のサーバーのMySQLバージョンは同じです。構成ファイルも同じです(唯一の違いは、データのパスと、運用サーバーがエラー以外のログを記録しないことです)。私が話しているパフォーマンスの違いは3桁または4桁大きくなっています(たとえば、テストサーバーでのクエリは0.2秒で実行されますが、運用サーバーでは84秒で実行されます)。
問題のクエリは、 "WHERE [...] IN [...]"を含む句を多用しています。これは、通常非常に遅く、JOINに置き換える必要があることを理解しています。ただし、使用しているMySQLのバージョンは5.6.19であり、これらのクエリは自動的に最適化されます。そのため、テストサーバーではクエリが高速に実行されます(変更できないプログラムの一部であるため、手動で最適化することはできません)とにかく)。
先ほど述べたように、MySQLのインストールと構成は同じであるため、問題がどこにあるのかはまったくわかりません。一方では、プログラムとDBが同じであるため、なんらかの構成上の問題である必要があると思いますが、一方で、構成が同一であるため、これは意味がありません。
サーバー上のデータ:
テストサーバー:
- Intel Core 2 Quad Q9400 @ 2.66GHz
- 8GB RAM
- Windows Server 2008 R2スタンダード
本番サーバー:
- Intel Xeon E5530 @ 2.40GHz
- 5GB RAM
- Windows Server 2012 R2スタンダード
編集:重要なことを言うのを忘れていました。「問題の」クエリとは別に「WHERE ... IN」句を使用するクエリが実行されています。これらは両方のマシンで高速に実行され、MySQLによって正しく最適化されていることを示唆しています。他のクエリが最適化されていないときに最適化されているクエリがあるのは不思議です。これが実際の問題であるかどうかは不明です。
編集#2:両方のサーバーの構成ファイルは次のとおりです:http : //pastebin.ca/2834906
編集#3:遅いクエリの1つ のEXPLAINは次のとおりです。https://mariadb.org/ea/v36zj EXPLAINは、テストと製品の両方でまったく同じです。クエリ自体はこちらです:http : //pastebin.com/VXgBxXmtこれはオートフォーマッタでフォーマットされているため、あまり明確ではありません。ご覧のとおり、は非常に長く複雑です。これは手動で生成されたものではなく、いくつかの機能を備えた標準SQLの方言を使用するソフトウェアによってさらに自動的に生成されます。
また、詳細情報:本番サーバーのデータを減らし、使用されないDBの古いデータのほとんどを削除することで、一時的に問題にパッチを適用しました。もちろん古いデータも必要なので、これは解決策ではありません。将来的には問題になるでしょう。DBはそれほど大きくありません。完全なDBは1308MBで、現在生産中の縮小バージョンは332MBです。
更新:解決しましたか?
私は問題を解決したと思います。本番サーバーが実際に使用されているため、まだテストしていませんが、考えられる問題は、182Mに設定されたパラメーター "innodb_buffer_pool_size"でした。実際には、構成ファイルの行は次を示しています:innodb_buffer_pool_size = 321これはユニットプレフィックスがないため誤りであり、無効な値(ドキュメントによると最小値は5242880)を与え、それを前の値に置きます。テストサーバーのこの値は、目的の321Mに設定されています。
私が言ったように、私はそれを完全にテストしていません。私がしたことは、テストの価値を減らし、アプリケーションを試すことです。すべてが遅くなり、私が投稿した特定のクエリは3分で実行されます。
私は3Gbのより健全な値をテストしましたが、それが良いアイデアであるかどうかはわかりません。そのため、この値について誰かがコメントがあれば、感謝します。
私の結論は、3Gbの「健全な価値」と私がこれに使用した情報は、これら2つの投稿、特に2番目の投稿からのものです。
MySQLクエリ、2つの同様のサーバー、実行時間の2分の違い
mysqlのinnodb_buffer_pool_sizeはどのくらいの大きさにすべきですか?
本番サーバーの値を更新するときに、「実際の」結果を投稿します。
みんなありがとう。
解決した
それで、最終的に製品でこれをテストしました、そしてそれは私が以前にコメントした問題でした。以前のリンクによると、このサイズと使用法のDBの場合は約3Gであるはずですが、innodb_buffer_pool_sizeの値を321Mに設定します。これは、使用するSDKのベンダーが推奨する値です。
ただし、まだ疑問があります。321の値は無効な値(小さすぎる)だったので、MySQLは別の値を取っていました。私の疑いは、それが以前の有効な数、テストで321M、製品で182Mを要したため、速度の違いでした。好奇心が抜けただけなのですが、これが正しいかどうか知りたいです。
助けてくれてありがとう。