SQL故事分为两部分-SQL视图总是好的吗?如何解决此示例?

SQL故事分为两部分-SQL视图总是好的吗?如何解决此示例?,sql,mysql,sql-view,Sql,Mysql,Sql View,我正在开发一个报告应用程序,因此我正在处理大量的数据。我以敏捷方式创建应用程序的部分方法是,如果多个用户都在攻击数据库,则使用SQL视图减轻数据库的压力 一个例子是: mysql_query("CREATE VIEW view_silverpop_clicks_baby_$email AS SELECT view_email_baby_position.EmailAddress, view_email_baby_position.days, silverpop_campaign_emai

我正在开发一个报告应用程序,因此我正在处理大量的数据。我以敏捷方式创建应用程序的部分方法是,如果多个用户都在攻击数据库,则使用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.)拥有另一组视图将不会缓存count变量,因此从这个角度来看,这是没有好处的

    话虽如此,我认为你对观点的实际作用存在误解。视图只是特定SQL语句的定义,它不缓存数据。执行
    时,从myView中选择*,数据库仍在执行创建视图定义中定义的select语句,就像用户执行该语句一样

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

    视图的一些有用用途包括:

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

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

    • 创建表的聚合


    • 回答您的问题

      1.)我不知道我能想到一个视图本身不好的例子,但是不必要地使用它们是不好的。你是否能吃得太多实际上取决于你的情况

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

      话虽如此,我认为你对观点的实际作用存在误解。视图只是特定SQL语句的定义,它不缓存数据。执行
      时,从myView中选择*,数据库仍在执行创建视图定义中定义的select语句,就像用户执行该语句一样

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

      视图的一些有用用途包括:

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

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

      • 创建表的聚合


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

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

    • 有些视图从未使用过,因此它们代表了竞争性,这是不好的
    • 索引视图不能引用其他视图(mssql),因此创建此类视图几乎没有意义

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

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

    • 有些视图从未使用过,因此它们代表了竞争性,这是不好的
    • 索引视图不能引用其他视图(mssql),因此创建此类视图几乎没有意义

    • 由于用户众多,视图不会减轻数据库的任何压力。这只是一个逻辑结构,用来隐藏查询的复杂性。我的印象是视图被缓存了——这意味着它们大大加快了数据的传递?查询执行计划被缓存了,而不是数据本身。要缓存数据,您需要索引视图或物化视图。由于用户众多,视图不会减轻数据库的任何压力。这只是一个逻辑结构