web-dev-qa-db-ja.com

ページの読み込みごとに20のSQLクエリが本当に多く考慮されていますか?

私はJeffAtwoodのブログを読んでいました WordPress、CPUの駆逐艦を見よ そしてそこにいる多くの人々がページの読み込みごとに20のSQLクエリが多いと考えているのを見ました。自動提案、データの自動更新、カスタマイズされたページ、およびキッチンシンクを備えた非常に動的なページの最近のページあたりのクエリの平均量はどれくらいですか?

簡単な例として、Amazon.comは、私が購入すると思われるもので私のホームページを実際にカスタマイズします。私には、フロントページに5つ以下のクエリを使用しているようには見えません。

私はまだデータベースの初心者なので、明らかな何かが足りない場合は教えてください。

35
danmine

通常、20個の小さなクエリではなく、2つまたは3つの大きなクエリですべてのデータを取り込むことができます。クエリの量を最小限に抑えることは、パフォーマンスを最大化するために最適なクエリを作成することと同じくらい重要です。

もちろん、常にクエリプランを分析し、大小を問わず、最適なクエリを目指す必要があります。

重要なのは、不適切に設計されたWebページは、1つのクエリに簡単にグループ化できる小さな小さなタスクごとに1つずつ、多くのクエリを実行するということです。

たとえば、不適切に設計されたスタックオーバーフローが発生する可能性がありますクエリを実行してメインページに表示されるすべての質問IDを取得し、質問ごとに1つのクエリを実行して概要と投票を取得します。次に、簡単に20の役に立たないクエリがあります。適切に設計されていると、単一のクエリを実行して、表示されるすべての質問に関するすべての情報を取得します。

もちろん、このすべての影響は、すべての大規模サイトが行うことである優れたキャッシングによって軽減されます。これにより、実際に多くのクエリを実行しながら、適切なパフォーマンスを得ることができます。

29
Vinko Vrsalovic

それはキャッシングについてです。

多数の同時ページビューを取得していて、各ページビューが多くのクエリを実行する場合、データベースにアクセスすることはあまり意味がありません毎回。特に戻ってくるデータの多くが、時々しか変化しない半動的な参照データによる場合(常に変化するセッションまたはリアルタイムのデータとは対照的)。

Memcachedまたは同様のものを使用して、これらのデータベースの結果をキャッシュすることもできます。ページ全体をキャッシュする必要はありません(ただし、ほとんどのWordpressキャッシュプラグインが行うことです)。これにより対話性が失われますが、データごとにキャッシュできます。

クエリの最適化の問題もあります。特に、親レコードに対して1つのクエリを実行し、次にその子のeachに対して追加のクエリを実行するという恐ろしいN +1の状況を回避します。データベースとの間の往復の待ち時間だけで、DB自体に悲しみを引き起こすことは言うまでもなく、ページのレンダリングパフォーマンスが低下します。

12
madlep

私はいつもパーティーに遅れて来ます、これはちょっと5年遅れています...

しかし、この質問に対する的確な答えは、質問の数が質問にかかった合計時間よりも少ないということです。

複数の結合とサブクエリを含む大きなクエリの実行に20秒かかる場合、(私が思うに)全部で.20秒かかる20の小さなクエリの方がはるかに優れています。

主にすべてのクエリをキャッシュし、その個々のクエリのデータを何度も何度も再利用できるため、小さなクエリの管理がはるかに簡単になります。

7
Amit Kriplani

答えは実際にはいくつかの重要な事柄に依存します:-サイトのトラフィック量-サポートのためのIT予算-サイトの複雑さと最適化に必要なリソース

あなたが一日に数回ヒットするウェブサイトを持っているなら、誰が約20のクエリを気にします。反対に、Amazonの場合は、必要なコンテンツを大きなインフラストラクチャコストで提供することになります。

世界の他のほぼすべての人は、これら2つの極端な中間にあり、自分のリソースに基づいてバランスを取る必要があります。

私が言う他の唯一のことは、キャッシングはあなたの友達です。

5
Darian Miller

これは、構築しているアプリケーションのタイプ、クエリの複雑さ、およびデータベースエンジンとサーバーで実行できることによって異なります。

データベースサービスで単純なSQLクエリのみを作成できる場合、小さな一般的なWebページでは20未満のクエリで十分ですが、大学のWebページまたは意思決定サポートアプリケーションの場合は、60では不十分な場合があります。

特権があり、DBMSに対応している場合(たとえば、古いバージョンのMySqlと比較してOracleなど)、20を超えるクエリで、重いタスクのストアドプロシージャ、関数、およびトリガーの作成を開始するように求められます。多くの場合、それは不可能であるため、クエリの数は自然に増加し、サーバーへのプレッシャーを軽減するためにキャッシュの使用を開始します。

たとえば、サブクエリを使用して少ないクエリで実行できる重いタスクもありますが、データベースエンジンでは非常に重いタスクです。場合によっては実際には推奨されないため、何千ものレコードが含まれる場合は注意して使用する必要があります。

Vinkoの例は、1週間の小規模な開発「プロジェクト」に当てはまるかもしれませんが、Amazonについて尋ねると、一般的なPHP/MySQL開発パッケージ;背後にあるフロントドアは、分散コンピューティングとデータマイニングのアルゴリズムの複雑なシステムにあります。初心者の場合は、そのような兄貴を参考にしないでください...

2
DanyAlejandro

20のクエリを実行する必要がある場合は、そうですが、フロントページの場合は少し緊張します。

可能な場合はクエリを組み合わせると役立ちますが、キャッシュについて考えることが最も重要な部分です。

私は現在、年に5〜6回変更されるデータが、非常に厄介なSQLを使用してツリーに変換し、1日に数千回クエリされるサイトをアップグレードしていますが、約200kのRAMにツリー構造として保持できます。 (フロントページにも700kのビューステートがありますが、それは別の話です...)これらは正当な理由もなくWebサイトを不自由にするようなものです。

したがって、実行する必要があるクエリと実行しないクエリの数についてはマジックナンバーはありませんが、5分間だけキャッシュしたとしても、すべてのクエリについて考えてみてください。 diggのフロントページ。

たった1つのクエリで5分間キャッシュすると、サイトにストレスがかかっているときに何千ものDBヒットを削除できます。

1
seanb

Ajaxを使用しない限り、各ページはアトミックであるため、3つ以下のクエリで非常に複雑なページを生成することはそれほど難しいことではありません。概念的には、一般的なページセットには次のものが含まれます。

  1. コンテキスト情報(セッションおよびその他のグローバル状態に関連)。
  2. ヘッダー(および関連する1:0-1結合);
  3. 詳細(2から1:M)。

事前に計画を立てる必要があります。しかし一方で、ほとんどの場合、これは簡単なリファクタリングの演習です。

1
dkretz

クエリの数は常にそれほど重要ではありません。それは本当にあなたが接続を処理する方法です。接続プールがある場合、それは実際には重要ではなく、サーバーの物理的な場所が重要です。サーバーがデータセンター内で隣り合っている場合、接続のセットアップはおそらく非常に高速です。データベース駆動型サイトの場合、ほとんどの場合、Webサイトの読み込みに費やされる時間は、接続が開かれ、データがフェッチされるのを待つことになります。接続を開くには、100〜300ミリ秒かかります。したがって、データベースアクセスごとに20の接続を開く必要がある場合、接続を開いたり閉じたりするだけで4〜6秒になります。

Jeff AtwoodはLINQを使用しているので、彼は1つの接続のみを開き、20のクエリを実行してから、接続を閉じると想定しています。それはおそらくかなり迅速に起こります。

また、Jeffのデータベースは同じ物理マシン上で実行され、内部マシン通信を使用してネットワークではなくデータベースと通信するため、TCPタイプの接続に関連する遅延は実際にはありません。 (彼は数週間前にHanselminutesポッドキャストでこれについて話しました。)

LINQを使用し、同じボックスにデータベースを使用しているサイトの1つに対して同様の構成があります。ローカルマシンでサイトを実行し、別の状態でサーバー上のデータベースにアクセスすると、データ量の多いページをいくつかロードするのに最大6秒かかります。サーバー上でサイトを実行すると、すべてがサーバーに対してローカルであるため、ページが1秒未満で読み込まれます。

0
Paul Mendoza

私の経験則では、サイトのタイプに応じて、可能であればフロントページを5〜7未満に抑えます。

インテリアページは、必要なものによってはもっとあるかもしれませんが、私はそれを20未満に保つためにできることをします。

ただし、同時に、実行しようとしていることと、その情報を使用して実行しているキャッシュの種類によっては、そのうちの15個が大量にキャッシュされている場合でも悪くない場合があります...

0
Mitchel Sellers