2009-08-12 4 views
1

私は私のウェブサイトプロジェクトのおよそ10%です。私はデータベースにどのような負荷をかけているのか把握しようとしています。ユーザーがログインすると、毎分トリガーする多くの機能があり、ユーザーがページを訪れるたびに、エリアコードリスト、州、国などの要素が多数登録されて登録ページが作成されます。私は、データベースに関与しないように、その一部をPHPに移すことができると確信しています。バックエンドでmysqlを使用しているWebサイトの平均負荷または高負荷とは何でしょうか?

6日、14時間、57分、58秒で、平均12.69 k /分と211.43 /秒の平均120,998,563件のクエリが表示されます。私は79の最大同時接続をリストしています。これらの最後の2つは意味をなさない。受信平均は133 MiB /時間、送信平均は1,997 MiB /分です。

+1

データベースが最適化され、インデックスが良好である限り、phpとは対照的にdbを作業にする方がほとんど常に高速です。 –

答えて

2

テーブルに何百万もの行があり、正しいインデックスを使用していない場合、サーバーは落ちます...クエリがあれば適切なインデックスを使用して超最適化されています。また、多くのデータがない場合は、サーバーが稼動します。

あなたは、少なくともそれらがその後のインデックス;-)

を使用して/最適化されているかどうかを確認するために、最も使用されているクエリにEXPLAINを使用する場合があります、あなたはおそらくキャッシュmecanismのように種類を追加することになるでしょう例えば、APCまたはmemcached;少なくともあなたができるのであれば...
たとえば、リストの状態と国はおそらく変わらないでしょう:それはキャッシュされ、データベースに何千回もぶつかることなく、1日に1回、または1時間に1回と言えます。

+0

1つのソースが見つかりました。私は16x16アバターの一連のサムネイルをデータベースに追加し、192x192の数を追加しました。私は、それらのうちの1つが表示されるたびに、データベースクエリが作成され、時には、ユーザーが画面上に20を持つと思うのをやめました。メッセンジャーパネルでは、30秒ごとに更新されます。私はすべての画像を引き出し、ディレクトリ構造の中で通常どおりそれらを保存/参照しています。 –

+0

これは本当に問題になる可能性があります:-);しかし、私が説明したことについては何も言及していませんが、それでもなお有効です;-) –

-1

最もよく見るべきことは、1ページあたりのクエリ数であり、次にどのような種類のクエリであるかを調べることです。たとえば、単純なSELECT文は非常に高速ですが、3つの表を結合する場合は非常に遅いです。また、データベース表の索引と制限にも依存します。

本質的に、私たちは本当にあなたに伝えるのに十分な情報がありません。あなたが与えたものであっても、一度にユーザー数が分からなくてもかなり役に立たない。

+0

適切なインデックスがある場合、結合は遅くなりません。 –

+0

私はデータベースについてはあまりよく分かりませんが、私が知っていることはほとんどわかりませんが、索引は必ずしも一時テーブルが必要でないことを意味するものではなく、高価です。++ –

0

低速クエリログ(http://dev.mysql.com/doc/refman/5.0/en/slow-query-log.html)の有効化と監視を開始することができます。クエリの数は、インデックスに当たっている限り、またはクエリキャッシュがさらに優れている限り、必ずしも負荷が高いとは限りません。いくつかの設計が不適切であれば、サーバーを停止させる可能性があります。遅いクエリログではそれらを指摘するため、最適化に時間を費やすことができます。

0

他の人からも言われているように、クエリの数は重要ではなく、より多くのクエリの種類とデータベースのインデックスの種類です。また、他の誰かがAPCやmemcacheのようなキャッシュ機構を見ていますが、私はまた、PHPクラスのキャッシュシステムを推奨します。 zendフレームワークには1つがあり、私は個人的にPEARライブラリのCache_Liteを使用しています。 PHPのレベルで最新の情報を絶対に更新する必要はないdbクエリをキャッシュすることができます。したがって、ページが実行されている場合、10個のクエリが実際には2または3個しか新鮮な情報でなければならないので、他のクエリを5または10分キャッシュすることができます。 1分のキャッシュでさえ、大量のサイトに多くのトランザクションを保存します。

1

いくつかのより多くのヒント:

A - あなたはn×nのランタイムクエリを実行していないことを確認します(または、少なくとも同じくらいすることができますようにそれを回避しよう)。「末端QUERY2 末端ながらクエリ

間違いドンながら - QUERY2 - - (QUERY2)しばらく

-query -while(クエリ) を:どのような私はそれの意味することは行っていないです第3レベル(n^3)に入る...

Bスピードについてのもう一つのこと:やらない場合は、を選択*から*姓と名だけが必要な場合は、これらを選択してください。データがより早く返されます。あなたはそれをより速く通過することができます。

+0

著者は一度、100万行のテーブルを比較して、Select *とSelect col1、col2、col3。 。 。私のGoogleの忍者のスキルは今日欠落しているに違いありません、私は記事を見つけることができないようです。私が正しく覚えていれば、テーブルは適切なインデックスとキーを持つ必要があるということです。とにかくこれは良いデータベース設計の核心ではありませんか? – andrewWinn

+0

hmmm ...興味深いと思います...しかし、30個のうち1個のカラムだけを取り出すときは、より論理的であり、1個のカラムデータがDBからより速く転送されると思います。少ないデータがより速くなりますか? –

+0

@officeJet - そういうわけで、私はGoogle Ninjaスキルの欠如に悩まされています。 。 。私は記事を読んですぐに、彼らが驚いたすべてのDBAと共有しました。 。私はあなたが説明した状況では、あなたは正しいと思いますが、それは疑問を募らせます、なぜあなたは30のうちの1つの列だけを引っ張っていますか?リファクタリングの時間? ;) – andrewWinn

0

あなたのホスティング環境ももう一つの要因です。多くの共有ホストでは、同時に許可されるデータベース接続の数に制限があり、この制限は驚くほど低い場合があります。統計的には、訪問者がその日までに均等に分散されていることを前提とした場合、通常は問題ありませんが、特定の時間にコンテンツが出てくるのを期待する十分な視聴者がいる場合は、狭い時間枠でスクリプト(およびデータベース接続を開く)

関連する問題