SQL故事分为两部分-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
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),因此创建此类视图几乎没有意义
由于用户众多,视图不会减轻数据库的任何压力。这只是一个逻辑结构,用来隐藏查询的复杂性。我的印象是视图被缓存了——这意味着它们大大加快了数据的传递?查询执行计划被缓存了,而不是数据本身。要缓存数据,您需要索引视图或物化视图。由于用户众多,视图不会减轻数据库的任何压力。这只是一个逻辑结构