0

我正在构建一个报告应用程序,因此我正在处理大量数据。我以敏捷方式创建应用程序的部分方法是在多个用户都在抨击时使用 SQL 视图来减轻数据库的压力。

一个例子是:

    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%'";

我的问题实际上分为两部分:

  1. 观点总是好的吗?你能有太多吗?
  2. 我可以创建另一组视图来缓存第二个代码片段中的计数变量吗?如果是这样,我该如何处理?我还不能完全弄清楚这一点。

谢谢!

4

2 回答 2

4

回答你的问题。

1.)我不知道我能想到一个视图本身很糟糕的例子,但不必要地使用它们会很糟糕。你是否可以拥有太多真的取决于你的情况。

2.) 拥有另一组视图不会缓存 count 变量,因此从这个角度来看它不会是有益的。

话虽如此,我认为您对视图的实际作用有误解。视图只是特定 SQL 语句的定义,它不缓存数据。当您执行 aSELECT * FROM myView;时,数据库仍在执行 CREATE VIEW 定义中定义的 select 语句,就像用户正在执行该语句一样。

一些数据库供应商提供了一种不同类型的视图,称为物化视图。在这种情况下,创建视图所需的表数据被存储/缓存,并且通常根据创建时指定的刷新率进行更新。这是“沉重”的,因为您的数据存储了两次,但可以创建更好的执行计划,因为数据已经加入、聚合等。但请注意,您只能看到基于物化视图的最后一次刷新的数据,在普通视图中,您可以看到当前存在于基础表中的数据。目前,MySQL 不支持物化视图。

视图的一些有用用途是:

  • 为复杂查询创建更简单/更清晰的 SQL 语句(这是您正在做的事情)

  • 安全。如果您希望用户能够看到某些列或行,但不能看到其他列/行,则限制对基表的访问并创建基表视图,该视图仅选择用户也应该有权访问。

  • 创建表的聚合

于 2009-12-01T11:50:31.603 回答
1

查询优化器使用视图,因此它们通常有助于更有效地查询信息。

然而,索引或物化视图会创建一个包含所需信息的表,这可能会产生很大的不同。将其视为您的数据库方案的非规范化而不更改现有方案。你得到两全其美。

  1. 有些视图从未使用过,因此它们代表了复杂性——这很糟糕。
  2. 索引视图无法引用其他视图 (mssql),因此创建此类视图几乎没有意义。
于 2009-12-01T11:51:39.637 回答