1

私はアドバイスを求めてスタックを見回してきましたが、これを改善する最善の方法についてまだ100%確信が持てません。約 130K のレコードを格納する mysql INNODB 'product' テーブルがあります。その他の製品データなどには約 80 のフィールドがあり、各サプライヤー (コスト/ID/在庫) に対してサプライヤー在庫データ フィールド x 3 を追加した結果、さらに 35 ~ 40 の余分なフィールドができました。

xml/xls フィード用の loaddata または php スクリプトを使用して、サプライヤーごとに個別のテーブルにサプライヤー データ フィードを実行します。次に、単一のクエリを実行して、各テーブルの ID と一致する関連するサプライヤー テーブルの最新データで製品のコスト/在庫を更新します。このプロセスは、各サプライヤー フィード (現時点では約 15) に対して実行されます。場合によっては 1 日 1 回、場合によっては 2 回/3/4 回、フィードのサイズは数百から 1/3/20/30K までさまざまです。

次に、(サプライヤー データ フィードのインポート スケジュールが異なるため、1 日に数回) スクリプトを実行して、すべてのサプライヤーの在庫を (メインの製品テーブル データから) 比較し、その時点で在庫のある最も安いサプライヤーに基づいて価格を生成します。次に、どこかに在庫がある各アイテムについて、製品テーブル内の全体的な最良の製品価格を更新します。

update best price スクリプトは、どこかに在庫があるテーブルからすべてのレコードを選択し、計算を行ってから、各製品を個別に価格で更新します。私たちが抱えている問題は、この時間中に速度が低下することです。これは、1 分から 2 分程度の場合もありますが、サイトのトラフィックなどによっては 5/6 から最大 10 分かかる場合もあります。 -これは、実行ごとに最大 20/30,000 のレコードに対して行われている間、インデックス付けされます。

product テーブルはサイトで最もビジーなテーブルであり、更新が実行されると、CPU が 300/350% まで上昇することがわかります。最初に最善の選択肢が、保存された最良の価格と集計された株価を別のテーブルに分離し、インデックス作成/ロックの問題を回避するために製品データを引き出すときにこのテーブルを結合することであるか、または単にdb/webserver/email などを引き続き処理できる新しいサーバーに移行するか、専用の DB サーバーを実行する必要があります。

問題の再移行または新しい専用 db サーバーは、サーバーがこれらの遅い更新期間を超えて 10/20/30/40% の CPU でうまく対処するときのボスの停止点であるコストです。db サーバーを使用する場合、最も簡単なオプションは、新しいサーバーを取得し、そこから db を実行して、カスタム アプリ/メール サーバー/Web サイト アプリケーション ファイルなどの再インストールを節約することです。現在持っているサーバーよりもスペックの低いサーバーを使用するか、DBサーバーが2つのサーバーよりも優れたスペックであることを本当に考える必要がありますか?? どんな助けや一般的なアドバイスも大歓迎です!!! ありがとう。

4

1 に答える 1

1

製品テーブルが非正規化されているようです。意味がよくわからない場合は、それを読んでください。それを理解することは、成功に不可欠です。

私があなたなら、このオプションを選択します。「保存された最良価格と集計在庫値を別のテーブルに分離し、インデックス作成/ロックの問題を回避するために製品データを引き出すときにこのテーブルを結合します」. つまり、製品テーブルと関連するサプライヤー情報について、非正規化スキーマから正規化スキーマに切り替える必要があると思います。

ただし、切り替えには開発者の労力がかかります。通常、開発者の人件費は、新しいサーバー ハードウェアよりも高くつきます。あるサーバー マシンから別のサーバー マシンに mySQL データベース インスタンスを移行することは難しくありません。新しいサーバー マシンを購入する場合は、余裕のある最速のディスク ストレージ サブシステムを購入してください。RAID を使用する場合は、RAID 5 ではなく RAID 1-0 (ストライプ化およびミラー化) を使用します。それ以外は、新しいサーバーに 4GB のメモリとデュアルまたはクアッド プロセッサを搭載する場合は問題ありません。

言い換えれば、優れたディスク ストレージ サブシステムを備えた 2012 年のありふれたミッドレンジ サーバー マシンを購入するということです。MySQL を新しいマシンに置きます (他のものはそのままにしておきます)。

ただし、アプリケーションをどれだけスケールアップする必要があるかを考えてみてください。

この製品のテーブルは、すでに数年後のサイズになっていますか? それとも、あなたの会社は、今後数か月または数年で、多くの新製品や新しいベンダーを追加する予定ですか? このシステムをスケールアップする必要がある場合は、実際には最初のオプションを選択する必要があります (開発者の労力を使用して、より適切で正規化された DBMS スキーマに変更する)。今すぐやり直してこの変更を加えれば、システムははるかに簡単にスケールアップできます。

しかし、会社の製品ラインがかなり安定している場合は、5 千ドルから 1 万ドル程度で新しいサーバーを追加するのが最も安価な方法です。

于 2012-04-17T00:13:46.630 に答える