0

私はレポート アプリを構築しているので、膨大な量のデータを処理しています。アジャイルな方法でアプリを作成するための私のアプローチの一部は、SQL ビューを使用して、複数のユーザーがすべてバッシングしている場合に DB の負担を軽減することです。

一例は次のとおりです。

    mysql_query("CREATE VIEW view_silverpop_clicks_baby_$email AS SELECT view_email_baby_position.EmailAddress, view_email_baby_position.days, silverpop_campaign_emails.id, silverpop_actions.`Click Name` , silverpop_actions.`Mailing Id`
FROM silverpop_actions
INNER JOIN view_email_baby_position ON (silverpop_actions.Email = view_email_baby_position.EmailAddress ) , silverpop_campaign_emails
WHERE silverpop_campaign_emails.id = $email
AND view_email_baby_position.days
BETWEEN silverpop_campaign_emails.low
AND silverpop_campaign_emails.high
AND silverpop_actions.`Event Type` = 'Click Through'") or die(mysql_error());

その後、スクリプトの後半で、このビューを使用して、この電子メールの特定の種類のクリック数が計算されます。

    $sql = "SELECT count(*) as count FROM `view_silverpop_clicks_baby_$email` WHERE `Click Name` LIKE '$countme%'";

私の質問は2つの部分に分かれています:

  1. ビューは常に良好ですか?多すぎてもいいですか?
  2. コードの 2 番目のスニペットで count 変数をキャッシュするために、さらに別のビューのセットを作成できますか。もしそうなら、どうすればこれにアプローチできますか?これはまだよくわかりません。

ありがとう!

4

2 に答える 2

4

あなたの質問に答えるために。

1.)ビュー自体が悪い例が考えられるかどうかはわかりませんが、不必要に使用するのは悪いことです。あなたが多すぎることができるかどうかは本当にあなたの状況に依存します。

2.)別のビューのセットがあると、カウント変数がキャッシュされないため、その観点からはメリットがありません。

そうは言っても、ビューが実際に何をするのかについて誤解していると思います。ビューは特定のSQLステートメントの単なる定義であり、データをキャッシュしません。を実行するSELECT * FROM myView;と、データベースは、ユーザーがそのステートメントを実行していた場合と同じように、CREATEVIEW定義で定義されたselectステートメントを実行し続けます。

一部のデータベースベンダーは、マテリアライズドビューと呼ばれる別の種類のビューを提供しています。この場合、ビューの作成に必要なテーブルデータは保存/キャッシュされ、通常、作成時に指定されたリフレッシュレートに基づいて更新されます。これは、データが2回保存されるという意味で「重い」ですが、データはすでに結合、集約などされているため、より適切な実行プランを作成できます。ただし、マテリアライズドビューの最後の更新に基づいたデータのみが表示されます。通常のビューでは、基になるテーブルに現在存在するデータが表示されます。現在、MySQLはマテリアライズドビューをサポートしていません。

ビューのいくつかの便利な使用法は次のとおりです。

  • 複雑なクエリ用のより簡単でクリーンなSQLステートメントを作成します(これはあなたが行っていることです)

  • 安全。ユーザーが一部の列または行を表示できるようにし、他の列/行は表示できないようにするテーブルがある場合は、ベーステーブルへのアクセスを制限し、その列/行のみを選択するベーステーブルのビューを作成します。ユーザーにもアクセス権が必要です。

  • テーブルの集計を作成する

于 2009-12-01T11:50:31.603 に答える
1

ビューはクエリオプティマイザによって使用されるため、情報をより効率的にクエリするのに役立つことがよくあります。

ただし、索引付きまたはマテリアライズド・ビューは、必要な情報を含むテーブルを作成します。これにより、かなりの違いが生じる可能性があります。これは、既存のスキームを変更せずにdbスキームを非正規化したものと考えてください。あなたは両方の世界を最大限に活用します。

  1. 一部のビューは使用されないため、針の複雑さを表します。これは悪いことです。
  2. インデックス付きビューは他のビュー(mssql)を参照できないため、そのようなビューを作成する意味はほとんどありません。
于 2009-12-01T11:51:39.637 に答える