从多个联接创建表以供分析时,何时使用视图而不是创建新表?

我更喜欢使用视图的一个原因是数据库架构是由以下人员开发的:我们的管理员来自Ruby,而我对Ruby并不熟悉。我可以要求创建表,但是需要额外的步骤,并且在开发/测试新联接时我希望有更大的灵活性。

我开始在遵循SO相关问题的答案之后使用视图(何时使用R,何时使用SQL)。投票最多的答案是“在SQL中进行数据操作,直到数据在单个表中,然后在R中进行其余操作。”

我已经开始使用视图,但是遇到了一些视图问题:


查询要慢得多
视图不会被转储从生产到用于分析的备份数据库。

视图是否适合这种用途?如果是这样,我应该期望性能下降吗?有没有一种方法可以加快视图查询?

评论

听起来这里的视图合适,但是我不确定在查询时可能导致速度降低的原因。
@FrustratedWithFormsDesigner是否有任何有助于诊断的诊断(除了创建可复制的示例之外)?直接在联接表上执行时,同一复杂查询花费<4s,在视图上完成时花费> 25s。预计视图不会带来性能损失吗?

自从我使用MySQL已有很长时间了,所以我真的不能说出来。

我使用MySQL,当您达到100K及以上时,我会告诉您视图是糟糕的,无法使用的,只需使用直接查询即可控制返回的字段和要使用的联接

#1 楼

MySQL中的视图使用两种不同算法之一处理:MERGETEMPTABLEMERGE只是具有适当别名的查询扩展。 TEMPTABLE听起来很像,视图将结果放在运行WHERE子句之前的临时表中,并且上面没有索引。
第三个选项是UNDEFINED,它告诉MySQL选择适当的算法。 MySQL将尝试使用MERGE,因为它效率更高。主要警告:

如果不能使用MERGE算法,则必须使用临时表。如果视图包含以下任何构造,则不能使用MERGE:


聚合函数(SUM(),MIN(),MAX(),COUNT()等)


DISTINCT


GROUP BY


HAVING



LIMIT


UNION或UNION ALL


选择列表中的子查询


仅引用文字值(在这种情况下,没有基础表)


[src]

我敢猜测您的VIEWS需要TEMPTABLE算法,导致性能问题。
这是一篇关于MySQL视图性能的非常老的博客文章,似乎还没有变好。
但是,在隧道尽头可能会有一些启发关于此临时表不包含索引的问题(导致全表扫描)。在5.6:

中,对于FROM子句中的子查询要求实现的情况,优化器可以通过向实现的表中添加索引来加快对结果的访问。
...
添加索引后,优化器可以将物化派生表与具有索引的普通表相同,并且从生成的索引中也可以得到类似的好处。与没有索引的查询执行成本相比,索引创建的开销可以忽略不计。

正如@ypercube指出的那样,MariaDB 5.3添加了相同的优化。本文对过程进行了有趣的概述:

应用了优化,然后派生表无法合并到其父SELECT中,当派生表不符合可合并VIEW的条件时会发生这种情况


评论


我没有对这些声明进行任何测试,但是MariaDB 5.3(最近以稳定版本发布)对优化程序进行了一些重大改进,包括视图:可合并视图和派生表的字段现在都包含在所有使用等值的优化中

–超立方体ᵀᴹ
2012年4月11日20:00

@ypercube感谢您的链接...看来MySQL 5.6至少在向派生表添加索引方面具有优化。

–德里克·唐尼(Derek Downey)
2012年4月11日在20:35

#2 楼

视图是安全工具。您不希望特定的用户或应用程序知道数据表的位置,而是只为视图提供所需的列。

请记住,视图总是会降低性能,类似的查询应存储在过程和函数中,而不是视图。

有很好的文档可以为您提供帮助:http://www.toadworld.com/LinkClick.aspx?fileticket=3qbwCnzY/0A=&tabid=234

评论


我不同意视图仅是安全工具。可以通过这种方式使用它们,但是我们可以使用它们来消除报表开发人员定期使用的查询的复杂性。

– JHFB
2012年4月11日19:07



@JHFB:我同意你的观点,但是也许这只是它在MySQL中的工作方式,听起来像视图会导致严重的性能损失?

– FrustratedWithFormsDesigner
2012年4月11日19:23



@frustratedwithformsdesigner好点-自从我使用MySQL已有一段时间了。

– JHFB
2012年4月11日19:24

Mysql上的@JHFB视图是一个大问题! mysqlperformanceblog.com/2007/08/12/…

–雷尼尔·莫里利亚(Rainier Morilla)
2012年4月11日19:52



@RainierMorilla视图降低性能!

– Suhail Gupta
16 Jul 17 '16:50



#3 楼

我认为视图是用于将表合并为一个表的预定义结构(无数据),可以从多表查询中克服,它可以从实际数据中用于快速关系查询的...

评论


目前尚不清楚您要提出的观点以及如何解决原始帖子中提出的问题。您可能想重新阅读该问题,但是无论如何,请考虑扩大您的答案,以便更清楚地将其应用于操作程序的问题。

– Andriy M
18年11月7日在10:13