从多个连接创建用于分析的表时,何时更倾向于使用视图而不是创建新表?
我更喜欢使用视图的一个原因是数据库模式是由我们的管理员在 Ruby 中开发的,而我对 Ruby 并不熟悉。我可以请求创建表,但需要一个额外的步骤,并且我希望在开发/测试新联接时具有更大的灵活性。
我在回答有关 SO(何时使用 R,何时使用 SQL)的相关问题后开始使用视图。票数最高的答案开始于“在 SQL 中进行数据操作,直到数据位于单个表中,然后在 R 中完成其余部分。”
我已经开始使用视图,但我遇到了一些视图问题:
- 查询要慢得多
- 视图不会从生产数据库转储到我用于分析的备份数据库。
视图是否适合这种用途?如果是这样,我应该期待性能损失吗?有没有办法加快对视图的查询?
MySQL 中的视图是使用两种不同算法之一处理的:
MERGE
或TEMPTABLE
.MERGE
只是一个带有适当别名的查询扩展。TEMPTABLE
就像听起来一样,视图在运行 WHERE 子句之前将结果放入临时表中,并且上面没有索引。“第三个”选项是
UNDEFINED
,它告诉 MySQL 选择适当的算法。MySQL 会尝试使用MERGE
,因为它更高效。主要警告:我冒昧地猜测您的 VIEWS 需要 TEMPTABLE 算法,从而导致性能问题。
这是一篇关于 MySQL 中视图性能的非常古老的博客文章,它似乎并没有变得更好。
然而,对于这个临时表不包含索引(导致全表扫描)的问题,隧道尽头可能会有一些启示。在5.6中:
正如@ypercube 指出的那样,MariaDB 5.3 添加了相同的优化。这篇文章对这个过程有一个有趣的概述:
视图是安全工具。您不希望特定用户或应用程序知道您的数据表在哪里,您提供的视图仅包含它需要的列。
请记住,视图总是会降低性能,类似的查询应该是存储过程和函数,而不是视图。
要进行查询调优,请始终遵循最佳实践,避免在 WHERE 子句中使用函数,创建索引以加快选择速度,但不要滥用索引会降低插入、更新和删除的性能。
有很好的文档可以帮助您:http ://www.toadworld.com/LinkClick.aspx?fileticket=3qbwCnzY/0A=&tabid=234
我认为视图是用于将表合并为一个以克服多表查询的预定义结构(无数据),它可以从真实数据中用于快速关系查询......