2012-01-22 10 views
1

Webアプリケーションでパフォーマンスの問題が発生しました。ボトルネックはdbだということを知りました。アプリケーションは、4つのCPUと2GBのRAMを搭載したLAMPサーバー(VPS)で動作しています。
新しいレコードをDB(約100.000レコードのテーブル)に挿入した後、selectクエリはしばらくの間減速します(時には数分です)。私は問題が再インデックス化していると思っていましたが、挿入後VPSでは実際には何の活動もありません。十分な記憶が残っており、交換する必要はありません。 CPUがアイドル状態です。INSERT後にMySQLの速度が低下する

真実は、選択は非常に複雑ですされています

SELECT COUNT(A.id), B.title FROM B JOIN A .... WHERE ..lot of stuff.. 

AとBの両方を約100Kレコードを持っています。 Aは多くの列を持ちますが、Bは少数ですが、ネストされた集合で表されるツリー構造です。 Bは頻繁に変わらないが、Aは変わる。条件は主にインデックスによってカバーされます。結果セットには通常約10〜30行あります。

実行できる最適化はありますか?

答えて

0

最初のことは:VPS内のCPU/RAMなどの測定値を信頼しないでください。マシン上で何が起こっているかを考慮していないので間違っている可能性があります(他のVPS)。パフォーマンスに関しては

...すべてのSQL文のクエリ・プランを確認し、アプリ自体にプロファイラを使用し、ボトルネックがどこにあるか見...

もう一つのポイントは、チェックすることですあなたのMySQL DBの設定...何か複製が進行中ですか(遅いこともあります)? DBには十分なRAMがありますか? DBは別のマシン/ VPSまたは同じVPSにありますか?

+0

問題は、私が使用できるツールはVM内だけです。私もvmstatsをチェックし、マシンは実際にはアイドリングしているようです。 アプリが責任を持って実行されていますが、挿入後に問題が発生するのはdb関連です。私は、同時要求がない孤立した環境でテストしました。 複製が進行中ではないので、私はinnodbプールサイズを512MBに設定します。 apacheとmysqlは同じマシンにあります。 – puty

1

あなたが比較「のような」やっまたはインデックスなしのvarchar型の列に加わることができ...あなたの「多くのものを」含めることができます:)

あなたにもあるインデックスの列を見てする必要があります重く使用された。

+0

"たくさんのもの"はアプリケーション自体によって生成されますが、LIKE文はなく、複雑なAND、OR、BETWEEN =はインデックス付きの列にあります。不要な結合も不要です。 – puty

+0

あなたはもっと情報を提供する必要があります。 100 000レコードは本当にそれほどではない、よく定義されたスキーマでさえ、あなたが言及したように10Millionレコードが「数分」を取るべきではない。 – Courage

+0

は数分かかるが、減速する。選択は通常よりかなり遅いです。 10秒以上..他にどんな情報がありますか? – puty

関連する問題