MySql视图性能

如果你正在使用视图的道路,你如何确保良好的performance?

还是最好不要在第一时间使用视图,而只是将相应的语句合并到您的select语句中?

这取决于。

这完全取决于你通过视图查看的内容。 但最有可能减less你的努力,并提供更高的性能。 当SQL语句引用非索引视图时,parsing器和查询优化器将分析SQL语句和视图的源,然后将其parsing为单个执行计划。 没有一个SQL语句的计划和一个单独的计划。

视图不被编译 。 它是由其他表组成的虚拟表。 当你创build它时,它不会驻留在你的服务器的某个地方。 构成视图的底层查询受查询优化器的性能增益或相同的性能影响。 我从来没有在视图VS底层查询上testing性能,但我会想象,性能可能会有所不同。 如果数据是相对静态的,您可以在索引视图上获得更好的性能。 这可能是你在“编译”方面的想法。

观点的优点:

  1. 查看数据而不将数据存储到对象中。
  2. 重新调整表格的视图,即可以隐藏表格中的一些列。
  3. join两个或更多的表格并将其显示为一个对象给用户。
  4. 重新设置表的访问权限,以便没有人可以将行插入到表中。

看到这些有用的链接:

  1. VIEW与SQL语句的性能
  2. 视图比简单查询更快吗?
  3. MySQL查看与PHP查询
  4. MySql Views是dynamic的还是高效的?
  5. 物化视图与表格:有什么优势?
  6. 查询视图比直接执行SQL慢吗?
  7. TEMPTABLE视图的性能问题的解决方法
  8. 通过在SQL Server中使用索引视图查看性能提升

我认为Peter Zaitsev的博客有大部分细节。 如果你通常保持简单,从个人经验的angular度来看可以发挥出色。 在我的一个客户中,他们不断将一个视图叠加在另一个视图上,最终陷入了性能噩梦。

通常我使用视图来显示表格的不同方面。 例如,在我的员工表中,向我展示经理或隐藏非HR员工的薪资领域。 还要确保你在查询和视图上运行一个EXPLAIN来准确理解MySQL内部发生的事情。

如果你想在你的情况下坚实的certificate,我会build议你testing。 真的很难说使用视图总是一个性能杀手,然后一个糟糕的书面观点可能会杀了你的performance。

他们服务于他们的目的,但隐藏的复杂性和低效率通常超过了一个更直接的方法。 我曾经遇到过一个join两个视图的SQL语句,并对结果进行sorting。 意见也在sorting,所以执行时间可以用几小时来衡量。

如果我们正在讨论“如果你使用观点,如何确保performance”,而不是一般观点的performance效果,我认为它归结为克制(就像你自己一样)。

如果您只是编写视图来使查询在所有情况下都很简单,那么您可能会遇到很大的麻烦,但不要担心您的视图实际上是有用的。 任何你最终做的查询应该是正常运行的(请参阅@eggyal的链接的评论示例)。 当然,这是一个同义反复,但不是那么有价值

你特别需要小心,不要从意见中发表看法,只是因为这可能使得更容易expression观点。

最后你需要看看你使用视图的原因。 任何时候你这样做是为了让编程更容易,编程结束你可能更好的存储过程恕我直言。

为了控制事情,你可能想写下为什么你有一个特定的观点,并决定为什么你使用它。 对于编程中的每一个“新”用法,重新检查是否真的需要这个视图,为什么需要这个视图,如果这仍然会给你一个合理的执行path。 继续检查你的使用,以保持迅速,并不断检查,如果你真的需要这样的观点。

这里是一个tl;博士总结,你可以find彼得Zaitsev和其他地方的详细评估。

在MySQL中的意见通常是一个坏主意。 在Grooveshark我们认为他们是有害的,并总是避免它们。 如果你小心,你可以使他们的工作,但他们是一种方法来记住如何select数据,或让你不必重新键入复杂的联接。 在最坏的情况下,它们会导致大量的低效率,隐藏复杂性,导致意外的嵌套子查询(需要临时表并导致磁盘颠簸)等。

最好避免它们,并将代码保存在你的代码中。

到目前为止没有提到的东西,但造成了巨大的变化是对视图表的索引

如上所述, 视图不驻留在数据库中,而是每次重build 。 因此,为数据库更容易重build的所有内容都会提高视图的性能。

通常情况下,视图以非常糟糕的方式(非常规forms)join数据,但对于进一步的使用(进行分析,向用户显示数据,…)非常有用,并且因此join和汇总来自不同表格的数据。

不pipe操作的列是否被索引,都会对视图的性能产生巨大的影响。 如果表和它们的相关列被索引,则已经访问视图并不会以重复计算索引的方式结束 。 (在不利的方面,这是在源表中操作数据时完成的)

索引在CREATE VIEW语句中的JOINS和GROUP BY子句中使用的所有列!